链表中倒数第k个结点
来源:互联网 发布:中国移动 健康大数据 编辑:程序博客网 时间:2024/06/16 02:53
链接:https://www.nowcoder.com/questionTerminal/529d3ae5a407492994ad2a246518148a
来源:牛客网
来源:牛客网
- 热度指数:255270 时间限制:1秒空间限制:32768K
输入一个链表,输出该链表中倒数第k个结点。
分析:当链表为空或k<1时,直接返回null。从头到尾循环链表,每移动一次,k值减1。定义两个指针,指针cur用于循环链表,指针ans返回倒数第k个结点。链表循环结束后根据k值进行分析:
(1)当k==0时,链表元素的个数等于k,倒数第k个结点即为链表的第一个元素;
(2)当k<0时,链表元素的个数大于k,该情况下链表循环结束后k为负值。从头开始遍历链表,直至k = 0,此时指针ans.next即为所求;
(3)当k>0时,链表元素的个数小于k,此时不存在链表的第k个结点,直接返回null。
/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(head == null || k < 1) return null; ListNode cur = head; ListNode ans = head; while(cur != null){ k--; cur = cur.next; } if(k == 0) return ans; else if(k < 0){ while(++k != 0){ ans = ans.next; } return ans.next; } return null; }}
还有一种思路是参考讨论中菩提旭光的回答:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指针走(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了。
public class Solution{public static ListNode FindKthToTail(ListNode head,int k) {if(head == null || k < 1) return null; ListNode cur = head; ListNode ans = head; for(int i = 0;i < k;i++){if(cur != null) cur = cur.next; else return null; } while(cur != null){ cur = cur.next; ans = ans.next; } return ans;}}
阅读全文
0 0
- 查找链表中倒数第k个结点
- 查找链表中倒数第k个结点
- 查找链表中倒数第k个结点
- 查找链表中倒数第k个结点
- 查找链表中倒数第 k个结点
- 查找链表中倒数第k个结点
- 查找链表中倒数第k个结点
- 输出链表中倒数第k个结点
- 查找链表中倒数第k个结点
- 查找链表中倒数第k个结点
- 链表中倒数第k个结点
- 链表中倒数第k个结点
- 查找链表中倒数第k 个结点
- 链表中倒数第k个结点
- 查找链表中倒数第k个结点
- 链表中倒数第k个结点
- 链表中倒数第k个结点[数据结构]
- 链表中倒数第k个结点
- #计算机网络第一章
- 单调栈
- ubuntu网易云音乐安装坑
- ajax与重定向
- 三个目前比较常见的连接池的简单运用
- 链表中倒数第k个结点
- tp5正则验证
- 修改主机名
- Unix-Linux编程实践教程——第四章
- 可靠性消息事务实现
- Bilateral Filters(双边滤波算法)原理及实现
- 第八周项目三(3)—顺序串算法之删除串s中所有的c字符
- 二相伪随机脉冲编码雷达-信号处理仿真
- printk和pr_info 调试