输出链表倒数第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; }
相关文章推荐
- 输出链表中倒数第k个节点
- 【华为oj2065】输出单向链表倒数第k个节点
- 微软面试之13 输入一个单向链表 输出该链表的倒数第k个节点
- 华为OJ题目(十九):输出单链表倒数第K个节点
- 输出链表倒数第K个节点
- 13--输出链表中倒数第k个节点,
- 输出单向链表倒数第k个节点,倒数第0个指向尾节点.
- 剑指offer-第三章高质量的代码(输出该链表中倒数第K个节点)
- 第十四题 输出链表的倒数第k个节点的值
- C语言实现输出链表中倒数第k个节点
- Java输出链表倒数第k个节点
- 输出单向链表中倒数第k个节点
- 给出一个单向链表的头指针,输出该链表中倒数第K个节点的指针
- (算法)输出单链表的倒数第k个节点,删除特点的节点和从链表尾一次输出节点值
- 算法学习-----输出链表的倒数第k个节点
- 输出链表的倒数第k个节点
- 给出一个单向链表的头指针,输出该链表中倒数第K个节点的指针
- 输出链表中倒数第k个节点
- 输出链表倒数第K个节点
- 输出链表的倒数第k个节点