查看链表的中间结点,链表的逆序,返回链表倒数第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个结点的主要内容,如果未能解决你的问题,请参考以下文章