1. 程式人生 > >輸入一個連結串列,輸出該連結串列中倒數第k個結點。

輸入一個連結串列,輸出該連結串列中倒數第k個結點。

兩種思路:

1)用棧的思想,先把連結串列反轉,然後再找出第k個節點

先把所有節點放進棧內,同時統計節點個數,若總節點數小於k則返回null。在彈出棧,倒數k即為彈出的第k個值。

2)定義兩個指標,一個指標先走k步,再兩者一起往後走,當第一個指標到達終點的時候,第二個指標剛好到達倒數第k點,因為他們之間的距離恆為k

import java.util.List;
import java.util.Stack;
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
	        if(head==null)
	            return null;
	        int i=0;
	        Stack<ListNode> stk = new Stack<ListNode>();
	        while(head!=null) {
	            stk.push(head);           //迴圈將連結串列中的節點壓入棧中
	            head=head.next;      
	            i++;            
	        }
	        if(k>i) {
	            return null;
	        }
	       ListNode result = null;
	         while(k!=0){
	        	result=stk.pop();    //將棧彈出k次,第k次彈出的節點就是我們要的倒數第k個節點
	        	k--;
	        }
              return result;
	    }
    }
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++) {//第一個指標走k-1步
	            if(pre.next!=null) {
	                pre=pre.next;
	            } else {//k大於連結串列的長度,找不到倒數第k個點
	                return null;
	            }
	        }
	        //此時兩個指標一起運動
	        while(pre.next!=null) {//直到第一個指標是最後一個節點
	            pre=pre.next;
	            last=last.next;
	        }
	        return last;
	    }
	}