您的位置:首页 > 其它

查找链表中倒数第k个结点

2016-04-24 11:05 309 查看
例如有一个链表一共有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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: