題目描述:
輸入一個鏈表,輸出該鏈表中倒數第k個結點。例如有一個鏈表有六個節點1,2,3,4,5,6.則它的倒數第二個節點為5
節點定義如下:
public class ListNode { int val; ListNode next = null;
ListNode(int val) { this.val = val; } }
思路一:
設置一個快指針,一個慢指針。像一把尺子,當尺子的一端移動到鏈表的末尾,則另一端則為倒數第k個節點。
public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(head==null||k<=0) return null; ListNode p,q; //定義兩個快慢指針,制造一把尺子 p=q=head; int i=0; for(;p!=null;i++){ if(i>=k) q=q.next; p=p.next; } return i<k?null:q; } }
思路二:
兩次遍歷。第一次遍歷出鏈表的長度n,第二次遍歷獲取鏈表第n-k+1個節點。
public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(head==null||k<=0) return null; //1.遍歷鏈表的長度 int n=0; ListNode tempNode = head; while(tempNode!=null){ n++; tempNode = tempNode.next; } if(k>n) return null; //2.遍歷獲取第n-k+1個節點 for(int i=0;i<n-k;i++){ head = head.next; } return head; } }
思路三:
借助棧來存儲所有節點,在利用出棧獲取倒數第k個節點
public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(head==null||k<=0) return null; //1.借助棧來存儲節點 Stack<ListNode> stack = new Stack<>(); while(head!=null){ stack.push(head); head=head.next; } //判斷k是否越界 if(k>stack.size()) return null; //2.出棧來獲取倒數第k個節點 while(k>1){ stack.pop(); k--; } return stack.pop(); } }