数据结构-链表(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaomifanhxx/article/details/83307805

上篇博客详细介绍了链表的基础功能增删改查,但是链表的主要难度是在链表的逆序上,下面主要介绍链表逆序。

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

猜你喜欢

转载自blog.csdn.net/xiaomifanhxx/article/details/83307805