查看链表的中间结点,链表的逆序,返回链表倒数第k个结点

Posted 蚍蜉撼树谈何易

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查看链表的中间结点,链表的逆序,返回链表倒数第k个结点相关的知识,希望对你有一定的参考价值。

一、链表的逆序
将链表的每个元素的指向做出改变,让它从初始链表的最后一个结点开始依次向前读取
方法:1.三指针法:pre记录操作链表元素前一结点 pcur记录的是当前操作结点 pnext 记录下一结点
2.将pre,pnext指向空,pre置空目的:让第一个元素的next变为空,方便读取。pnext无所谓。
3.pcur->next=pre; //更改链表连接
pnext=pcur->next;//保存pcur的下一结点
pre=pcur;//让pre指针依次每次都指向pcur的上一个元素
pcur=pnext;//更改pcur指向
4.最后将pheader->next=pre;//因为pre此时指向的是初始链表的最后一个元素。

void reverse_Linklist(LinkList pheader)
{
	if (pheader == NULL)
	{
		return;
	}
	//三指针法:pre记录操作链表元素前一结点 pcur记录的是当前操作结点 pnext 记录下一结点
	LinkList pre, pcur, pnext;
	pre = NULL;
	pnext = NULL;
	pcur = pheader->next;//之所以这么写,是因为我的头结点只做维护作用,不存在有效的值
	while (pcur)
	{
		pnext = pcur->next;
		pcur->next = pre;
		pre = pcur;
		pcur = pnext;
	}
	pheader->next = pre;

二、查看链表的中间结点
方法:快慢指针
原理:定义两个指针,一个为slow(慢)指针,fast(快)指针,慢指针每次指向下一个元素,fast指针每次位移到+2的位置。这样当fast指针移到末尾时,此时slow指针刚好指向链表的中间结点。

if (pheader == NULL)//有效性的判断
	{
		return;
	}
	LinkList fast, slow;
	//因为我的头结点并未使用有效值,所以此时指向的是头结点的下一个结点
	fast = pheader->next;
	slow = pheader->next;//让fast和slow均先指向第一个有效元素
	//为什么要让fast->next!=NULL?
	//因为fast要两个元素,所以避免越界。
	//这个会在有效元素为偶数个时候有用。可以画图分析一下
	while (fast != NULL&&fast->next!=NULL)
	{
		slow = slow->next;
		fast = fast->next->next;
	}
	//原理:因为快指针每次比慢指针多走一个,所以当快指针走到结尾时,此时恰好慢指针指向链表的中间结点。
	return slow;

三、返回链表的倒数第k个结点
方法:快慢指针
原理:先让fast指针走上k个步长。然后fast再和slow一起走。假设链表有n个有效元素,fast指针走上k个步长时,此时再需要走上n-k次就走向了NULL值,将fast!=NULL作为结束条件,此时slow也走了n-k个,就是对应着该链表倒数第k个元素、

LinkList find_endnumber(LinkList pheader, int k)
{
	if (pheader == NULL)
	{
		return;
	}
	LinkList fast,slow ;
	slow = pheader->next;
	fast = pheader->next;
	while (k--)
	{
		if (fast)
		{
			fast = fast->next;
		}
		else
		{
			return NULL;
		}

	}
	while (fast)
	{
		fast = fast->next;
		slow = slow->next;
	}
	return slow;
}

我这个或许不是最优的算法,希望了解更加透彻的大佬们可以不吝赐教!!

以上是关于查看链表的中间结点,链表的逆序,返回链表倒数第k个结点的主要内容,如果未能解决你的问题,请参考以下文章

链表的倒数第k个节点

链表中倒数第 K 个结点

华为机试HJ51:输出单向链表中倒数第k个结点

链表经典面试题(反转链表,中间节点,倒数第k个节点,合并分割链表,删除重复节点)

链表中倒数第K个结点

返回中间节点;返回倒数k节点;判断是否为环形链表(返回入环第一个节点)