单向链表_找出倒数第K个节点
来源:互联网 发布:java 日志分析工具 编辑:程序博客网 时间:2024/05/18 09:36
实现一个算法,找出单向链表中倒数第K个结点。
解法:
实现这个算法,可以用递归和非递归。因为单向链表只能向后遍历,所以一般会想到用递归这种方法,然后当递归遍历到链表末端时,该方法会回传一个置为0的计数器。
之后的每一次调用都会将这个计数器加1,当计数器等于K时,表示我们访问的是链表倒数第K个元素。
方法A
public static int nToLast(LinkedListNode head,int k){if(head==null){return 0;}int i = nToLast(head.next,k)+1;//当遍历到最后一个元素时,计数器i开始自增。</span>if(i==k){System.out.println(head.data);}return i;}
<span style="color:#33cc00;">//但是这个方法只能打印倒数第K个值,不能返回该元素,因为我们无法用一般的返回语句回传一个结点和一个计数器。</span>
方法B:
可以通过引用传值,这样一来,我们就可以返回结点值,而且也能通过传递指针更新计数器。
node* nToLast(node* head,int k,int& i){if(head==null){return null;}node* nd = nToLast(head.next,k,i);i=i+1;if(i==k){return head;}return nd;}方法C:
是基于方法B的思想,用一个简单的类包装计数器值,就可以模仿按引用传值。
public class MyCount{public int value = 0;}LinkedListNode nToLast(LinkedListNode head,int k,MyCount i){LinkedListNode node = nToList(head.next,k,i);i.value = i.value+1;if(i.value == k){return head;}return node;}
方法D
迭代法,一个更直接的方法,我们可以使用两个指针p1和p2,并将他们指向链表中相距k个结点的两个结点,具体做法是将p1和p2指向链表首结点,然后将p2向后移动k个结点,之后,我们以相同的速度移动这两个指针,p2会在移动length-k步后抵达链表末尾结点,这时,p1就指向链表倒数第k个结点。
LinkedListNode nToList(LinkedListNode head,int k){if(k<=0)return null;LinkedListNode p1 = head;LinkedListNode p2 = head;for(int i=0;i<k-1;i++){if(p2==null) return null;p2 = p2.next;}if(p2==null)return null;while(p2.next!=null){p1 = p1.next;p2 = p2.next;}return p1;}
0 0
- 单向链表_找出倒数第K个节点
- 找出单向链表中倒数第k个节点的算法
- 输出单向链表倒数第k个节点,倒数第0个指向尾节点.
- 单向链表倒数第K个节点
- 求单向链表倒数第k个节点
- C++求解单向链表倒数第k个节点
- 寻找单向链表的倒数第k个节点
- 单向链表的倒数第k个节点
- 9.2链表(二)——找出单向链表中倒数第k个节点
- 程序员面试金典: 9.2链表 2.2找出单向链表中倒数第k个节点
- 链表倒数第k个节点
- 链表倒数第k个节点
- 链表倒数第k个节点
- 链表倒数第K个节点
- 链表倒数第k个节点
- 链表倒数第k个节点
- 链表倒数第K个节点
- 面试100题:13.求单向链表倒数第k个节点
- 堆和栈的区别
- 安装Microsoft .NET Framework 3.5 Service Pack 1返回1603错误
- iphone 程序的设计模式
- 程序猿软件开发保护眼睛,win7设置窗口护眼模式?
- UVA 674 Coin Change(完全背包)
- 单向链表_找出倒数第K个节点
- 根据属性值渲染地图
- 【数据结构】顺序栈的基本操作操作---C/C++
- 求二叉树高度
- 划分树(多校联合)hdu3473
- 常见面试题
- JSP的工作原理
- 新人第一天,希望大家多多帮助
- Android优化大全