- 头插法一:
思想如下图:
如下代码:
///头插法建立单链表
LinkListNode *Create_Front_Lklist(ElemType arr[],int length)
{
LinkListNode *pHead,*p,*q;
int i;
pHead = (LinkListNode *)malloc(sizeof(LinkListNode));
pHead->pNext = NULL;
q = pHead->pNext;
//头插的时候,必须逆序遍历顺序表
for(i= length - 1;i>=0;i--)
{
p = (LinkListNode *)malloc(sizeof(LinkListNode));
p->data = arr[i];
p->pNext = q; //使得新加入的结点传入了上一个结点
pHead->pNext = p; //头结点指向了当前的新加入结点
q = pHead->pNext; //让q指向当前的结点
}
return pHead;
}
2.头插法二:
思想:如下图
在这里插入图片描述
如下代码:
///头插法二:
LinkListNode *Create_Front2_LkList(ElemType arr[],int length)
{
LinkListNode *pHead,*p,*q;
//p是新加入结点,q是当前结点
int i;
q = NULL;
for(i = length-1;i>=0;i--)
{
p = (LinkListNode *)malloc(sizeof(LinkListNode));
p->data = arr[i];
p->pNext = q;
q = p;
}
pHead = (LinkListNode *)malloc(sizeof(LinkListNode));
pHead->pNext = q;
return pHead;
}
3.头插法三:
思想如下图:
如下代码:
///头插法三:
LinkListNode *Create_Front3_LkList(ElemType arr[],int length)
{
LinkListNode *pHead,p;
int i;
pHead = (LinkListNode *)malloc(sizeof(LinkListNode));
pHead->pNext = NULL;
for(i = length-1;i>=0;i--)
{
p = (LinkListNode *)malloc(sizeof(LinkListNode));
p->data = arr[i];
p->pNext = pHead = pNext;
pHead->pNext = p;
}
//之所以我们的方法三可以节省方法一中的一个变量q
//原因是:pHead不发生变化,而pHead中的pNext始终作为当前结点的指针
return pHead;
}