题目描述:
输入一个链表,输出该链表中倒数第k个结点。
有三种解题思路:
1.传统的做法。先统计链表中节点的个数,倒数第k个结点相当于顺数第length-k+1个结点,依次遍历到该节点即可,代码如下:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
int length = 0;
ListNode cur = head;
ListNode curk = head;
while(cur != null){
length++;
cur = cur.next;
}
if(k > length)
return null;
else{
for(int i = 0; i < length - k; i++)
curk = curk.next;
}
//curk.next = null;
return curk;
}
}
2.设两个引用,先让第一个引用和第二个引用都指向头结点,然后再让第一个引用走(k-1)步,到达第k个节点。然后两个引用同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了。相当于制造了一个K长度的尺子,把尺子从头往后移动,当尺子的右端与链表的末尾对齐的时候,尺子左端所在的结点就是倒数第k个结点!代码如下:
/*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<=0){
return null;
}
ListNode pre=head;
ListNode last=head;
for(int i=1;i<k;i++){
if(pre.next!=null){
pre=pre.next;
}else
return null;
}
while(pre.next!=null){
pre = pre.next;
last=last.next;
}
return last;
}
}
3.用栈的先进后出特性来做,代码如下:
/*public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.Stack;
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
Stack<ListNode> stack=new Stack<ListNode>();
ListNode list=null;
ListNode tmp=head;
int n=0;
while(head!=null){ <span style="font-size:10px;">//大于等于k个节点,则全压入栈,再出栈k次</span>
n++;
stack.push(head);
head=head.next;
}
if(n<k) <span style="font-size:10px;">//少于k个节点返回null</span>
return list;
for(int j=k;j>0;j--){
list=stack.pop();
}
return list;
}
}