您的位置:首页 > 其它

输出链表倒数第K个节点

2015-04-09 14:41 190 查看


题目

    输入一个单向链表,输出该链表中倒数第 k  个结点。链表的倒数第 0  个结点为链表的尾指针。


思路

    算是比较简单的题目了。

    解法一:

    可以先遍历一遍统计链表个数,然后找到倒数第k个的下标再遍历,这样时间复杂富比较高

    解法二:

    双指针联动,一个指针先跑K个节点,然后两个指针一起跑,一个指针跑到尾节点时另一个指针恰好是倒数第K个节点。

include "stdio.h"
#include "stdlib.h"
//链表长度
#define N 50

//链表节点定义
typedef struct node
{
int date;
struct node * next;
}link;

link * lastK(link * head,int k);

int main(void)
{
link * head, *p;
int i;

//随机数种子
srand((unsigned int)time(0));

//生成链表
head = p = (link *)malloc(sizeof(link));
head-> date = rand()%101;
head-> next = NULL;
for(i=1;i<N;i++)
{
p = p->next = (link *)malloc(sizeof(link));
p->date = rand()%101;
p->next = NULL;
}

//输出链表
for(p = head;p;p=p->next)
printf("%d  ",p->date);

//产生K
i = rand()%100;
printf("\n随机生成一个K:%d",i);

//输出倒数第K个数
p = lastK(head,i);
if(p == NULL)
printf("错误!\n");
else
printf("\n倒数第%d个数是%d\n",i,p->date);
}

link * lastK(link * head,int k)
{
link * p,* q;
p = q = head;

if(k<=0)
return NULL;

//两个指针,q先跑个保证p最后指向的是倒数第K个
while(k-1 > 0)
{
if(q->next!=NULL)
q = q->next;
else
return NULL;
k--;
}

while(q->next != NULL)
{
p = p->next;
q = q->next;
}

return p;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: