算法学习-----输出链表的倒数第k个节点
来源:互联网 发布:淘宝防排查软件 编辑:程序博客网 时间:2024/05/22 18:55
假设链表有n个节点,那么倒数第k个节点,就是从头结点开始数到n-k+1个节点;所以自然就会两种思路:
1、如果可以遍历链表两次的话,第一次计数得到链表节点个数,第二次直接循环找到第n-k+1个节点返回就是。
2、如果链表只允许遍历一次的话,就必须使用两个指针(or引用):第一个指针从头开始走k-1步,第二个指针从头开始走,第一个到链表尾部,第二个指针的所指的就是倒数第k个节点
注意程序的(Robust)鲁棒性(这里鲁棒性是指:程序检查输入是否合乎规范,对于不合理的输入进行合理的处理)
/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*///方法一import java.util.*;public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(k<=0||head==null) return null; Stack<ListNode> stack = new Stack<ListNode>();// 建立栈结构 while(head!=null){//入栈操作 stack.push(head); head = head.next; } if(k>stack.size()) return null; ListNode count = head; for(int i=1;i<=k;i++){//出栈操作 count = stack.pop(); } return count; }}//方法二:public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(head ==null||k<=0) return null; ListNode h1 = head; ListNode h2 = head; for(int i=1;i<k;i++){//i应该指向第k个时,因为最后一次i 也+1了,但是不满足条件跳出循环了,第一次循环结束,h1指向了第二个,第k-1此循环结束,h1指向第k个 if (h1==null)return null; h1 = h1.next; } //由于循环条件判断的是h1,不是h1.next,循环到第k-1次结束时,h1指向第k个(如果第k个节点不存在的话只能循环到第k-2次,指向第k-1个节点)所以最后h1指向第k个节点是否存在需要如下验证 if(h1==null)return null;//最后一次不满足条件跳出循环了,所以需要验证h1循环的最后一次是否为空; while(h1.next!=null){//h1到最后一个节点,h2就是倒数第k个节点 h1 = h1.next; h2 = h2.next; } return h2; }}//方法三(跟上面的方法二几乎完全一样,除了循环条件之外)public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(head==null||k<=0)return null; ListNode p = head,q = head; for(int i=1;i<k;i++){ if(p.next!=null) p = p.next;//如果p节点后面还有节点,p指向后续节点 else return null; //否则的话,说明节点数少于k个,返回空 } if(p.next==null)return q;//如果此时k恰好是最后一个节点返回头结点 while(p.next!=null){//如果k不是最后一个节点,循环,判断p是否有后续节点 p = p.next; q = q.next; } return q; }}
阅读全文
0 0
- 算法学习-----输出链表的倒数第k个节点
- 输出链表的倒数第k个节点
- 输出链表的倒数第k个节点
- 输出链表的倒数第k个节点
- 输出单向链表倒数第k个节点,倒数第0个指向尾节点.
- 输出链表倒数第K个节点
- 输出链表倒数第K个节点
- 输出链表倒数第K个节点
- 第十四题 输出链表的倒数第k个节点的值
- 剑指offer----输出链表之中的倒数第k个节点
- 链表倒数第k个节点
- 链表倒数第k个节点
- 链表倒数第k个节点
- 链表倒数第K个节点
- 链表倒数第k个节点
- 链表倒数第k个节点
- 链表倒数第K个节点
- 输出链表中倒数第k个节点
- 夹克老爷发红包(51nod1625)
- java + 继承
- Android模拟器联网
- iOS-数据存储方式一之plist文件存储
- react-native,react-redux和redux配合开发
- 算法学习-----输出链表的倒数第k个节点
- 1449 砝码称重 51NOD
- Android 使用定位管理器
- ViewPager+Fragment+TabLayout实现的头部滑动
- 剑指offer面试题[4]-空格替换
- java + list 集合 类
- 总结篇-Spring-SpringMVC-Hibernate-jpa整合
- 用两个栈实现队列
- CMAKE基本使用