查找链表中倒数第k个结点
Posted xulu_258
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找链表中倒数第k个结点相关的知识,希望对你有一定的参考价值。
例如有一个链表一共有6个结点,从头开始他们的值依次是1、2、3、4、5、6,那么这个链表的倒数第三个结点是值为4的结点。
首先看到这个题目,我们也许会想到从链表的尾端开始遍历,回溯K步,可是这个链表是单链表,只有从前向后的指针,没有从后向前的指针,因此这种思路不行,
于是我们又想到链表的倒数第k 个结点就是从头开始的N-k+1个结点,因此只需从头遍历走n-k+1步即可。可是这样的话为哦们需要对链表进行两次遍历,因此最后我们想到可以用两个指针,第一个指针走K-1,然后让第二个指针指向头节点,当第一个指针指向末尾时,第二个指针即指向第k个结点了,具体代码如下:
<span style="font-size:18px;">/*删除链表中的的倒数第k个结点
1.k==0;
2.空链表
3.k>链表中的结点数
*/
#include<stdio.h>
#include<malloc.h>
typedef struct listnode
int value;
struct listnode *next;
listnode,*linklist;
//利用头插法建立单链表
linklist creat_linklist()
int x;
linklist s;
linklist head = (linklist)malloc(sizeof(listnode));
head->next=NULL;
scanf("%d",&x);
while(x!=-1)
s=(linklist)malloc(sizeof(listnode));
s->value=x;
s->next=head->next;
head->next=s;
scanf("%d",&x);
return head;
//查找链表中的倒数第K个结点
int findk(linklist head,unsigned int k)
unsigned int i;
listnode *phead=head;
linklist pbehind=NULL;
if(head==NULL||k==0)
return 0;
for(i=0;i<k-1;i++)
if(phead->next!=NULL)
phead=phead->next;
else //避免总结点小于K的情况
return 0;
pbehind=head;
while(phead->next!=NULL)
phead=phead->next;
pbehind=pbehind->next;
return pbehind->value;
int main()
unsigned int k;
int a;
linklist head;
scanf("%d",&k);
head=creat_linklist();
a=findk(head,k);
printf("%d\\n",a);
</span>
以上是关于查找链表中倒数第k个结点的主要内容,如果未能解决你的问题,请参考以下文章