输出单链表中倒数第k个结点
来源:互联网 发布:口袋打印机 知乎 编辑:程序博客网 时间:2024/06/07 00:12
题目:输入带头结点的单链表L,输出该单链表中倒数第k个结点。单链表的倒数第0个结点为该单链表的尾指针。要求只能遍历一次单链表。
解题思路:
如果不要求只能遍历一次单链表,我们可以先遍历一次单链表,求出它的结点的总个数n(包括头结点),所以单链表的结点是从倒数第n-1个到倒数第0个,然后再遍历一次单链表,遍历时访问的第n-k-1个结点就是该单链表中倒数第k个结点。现在要求只能遍历一次单链表,可以设两个指针p和q,最开始时它们都指向头结点,然后p向后移动k位,最后p,q同时向后移动直到p为最后一个结点,那么此时q即为所求。
ADT定义如下
#define ElemType int
typedef struct LNode{
ElemType data;
LNode *next;
}LNode,*LinkList;
算法实现:
- LNode* reciprocalKNode(LinkList &L,int k)
- {
- if(k<0) {
- printf("k不可以为负数");
- return NULL;
- }
- if(L==NULL)
- {
- printf("单链表为空");
- return NULL;
- }
- LNode* p=L;
- LNode* q=L;
- while(k>0)
- {
- p=p->next;
- if(p==NULL)
- {
- printf("单链表太短,不存在倒数第k个结点");
- return NULL;
- }
- }
- while(p->next!=NULL)
- {
- p=p->next;
- q=q->next;
- }
- return p;
- }
PS:这一题对于不带头结点的单链表的解法是一模一样的,只是我们通常用到的单链表都是带头结点而已。
0 0
- 输出单链表中倒数第k个结点
- 输出单链表中倒数第k个结点
- 输出单链表中倒数第k个结点
- 输出链表中倒数第k个结点
- 输出链表时倒数第K个结点
- 输出链表中倒数第k个结点
- 输出链表中倒数第K个结点
- 输出链表中倒数第k个结点。
- 输出链表中倒数第k个结点。
- 输出单链表中倒数第k个结点(Java版)
- 找出单链表中倒数第 K个结点
- 查找单链表中倒数第k个结点
- 寻找单链表中倒数第k个结点
- 输出链表倒数第K个结点
- 输出该链表中倒数第k个结点
- 13.输出该链表中倒数第k个结点
- 算法学习五---输出链表中倒数第k个结点
- 输出单向链表中倒数第k个结点
- 黑马程序员-java中的类型转换
- Android数据存储技术
- 删除单链表某个结点
- Docker学习笔记 — Weave实现跨主机容器互联
- Best Time to Buy and Sell Stock III -- LeetCode
- 输出单链表中倒数第k个结点
- C++ 调用WINDOWS图片和传真查看器打开图片
- ACdream 暴力专场B
- 百度面试题:从已排序的数组中求绝对值最小的元素
- 【学习笔记】C++中的string类详解
- eclipse中使用Maven
- Appium源码配置问题总结
- 操作系统常见的面试题整理
- stm32f10x