上篇博客详细介绍了链表的基础功能增删改查,但是链表的主要难度是在链表的逆序上,下面主要介绍链表逆序。
1、链表逆序(一)
链表的逆序有很多种思路,本文介绍一种将当前结点的下一结点一直往头指针之后移动的思路。
假设当前有5个结点,head、a1、a2、a3、a4、a5,他们的头指针是head。我们的思路便是将a1作为当前元素一直往后遍历,并且将a1后面的数据依次挪到head之后。
在第一次搬移的过程中,需要将a1的下一个元素a2放在head之后。如图所示,当前结点选定为a1,起一个变量名为current,当前结点的下一个结点为pNext,则a2便成了pNext = current->next。如果想要将pNext移到head之后,我们按照图中第1步先将a3连接到a1的后面current->next= pNext->next,然后第2步再将head后面的整体链表放到要移动的a2的后面,也就是pNext->next= head->next,第3步将a2移到head之后head->next=pNext。这三个步骤下来,我们的第一次反转工作就算完成了。此时的链表链表就变成了head、a2、a1、a3、a4、a5。
按照上图正确的顺序实现第一次反转以后,可以判定当前的current指针是否已经是尾指针,如果不是就可以继续执行。第二次反转后链表就变成了head、a3、a2、a1、a4、a5。因此当把链表内的最后一个元素也移动到head之后时,链表逆序的工作就算完成了。
代码:
//链表逆序
Linklist*ListRotate(Linklist*HeadNode)
{
Linklist *Cur,*pNext;
//HeadNode为首元节点,需要找一个指针为头结点
Linklist *pPre = (Linklist*)malloc(sizeof(Linklist));
if (pPre == NULL)
{
printf("内存不足");
return false;
}
Cur =HeadNode;
pPre->next = HeadNode;
while (Cur->next)
{
pNext=Cur->next;
Cur->next = pNext->next;
pNext->next = pPre->next;
pPre->next = pNext;
}
return pPre->next;
}
2、链表逆序(二):迭代的方式
链表的初始状态如下图所示
初始状态,prev是NULL,head指向当前的头节点A,next指向A节点的下一个节点B。首先从A节点开始逆序,将A节点的next指针指向prev,因为prev的当前值是NULL,所以A节点就从链表中脱离出来了,然后移动head和next指针,使它们分别指向B节点和B的下一个节点C(因为当前的next已经指向B节点了,因此修改A节点的next指针不会导致链表丢失)。逆向节点A之后,链表的状态如图(2)所示:
链表结束方式为head==NULL
代码如图所示
Linklist*ListRotate1(Linklist*HeadNode)
{
Linklist*pPre, *pNext, *Node;
Node = HeadNode;
pPre = NULL;
while (Node)
{
pNext = Node->next;
Node->next = pPre;//使得当前节点与链表分离
pPre = Node;
Node = pNext;
}
return pPre;
}
3、链表的逆序(三):递归的方式
还没弄懂回头更新;
运行的测试程序
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int b = 0;
int length = 0;
Linklist *Rotated;
Linklist*HeadNode = Init();//生成头结点
Creat_Linklist(HeadNode,a,5);
Insert_List(HeadNode, 3, 9);
Insert_List(HeadNode, 4, 10);
Insert_List(HeadNode, 4, 11);
Show_Linklist(HeadNode);
printf("\n");
Delect_Link_list(HeadNode, 5, &b);
Show_Linklist(HeadNode);
printf("\n");
length=Length_List(HeadNode);
printf("length is %d", length);
Rotated=ListRotate2(HeadNode);
Show_Linklist(Rotated);
system("pause");
}
参考博客:https://blog.csdn.net/ljyljyok/article/details/77996029