1. 程式人生 > >查詢連結串列的倒數第K個節點,只遍歷一次

查詢連結串列的倒數第K個節點,只遍歷一次

找到輸入一個連結串列,輸出該連結串列中倒數第k個結點,連結串列只遍歷一次

主要思想是:我們用兩個指標,先第一個指標走到K-1個節點,然後讓第二個指標指到0節點,讓兩個指標之間保持k的距離,當第一個指標指到最後一個時候,那麼第二個指標指到倒數第K個節點。

注意:此程式要考慮程式碼的魯棒性,當輸入的節點為空的時候,或者K值大於連結串列的長度的時候,都是異常輸入,需要進行處理

原始碼如下:

public class FindKthToTail {
    /**
     * 建立listNode節點
     */
private static class ListNode{
       int val;
ListNode next
=null; public ListNode() { } public ListNode(int val) { this.val = val; } } public FindKthToTail() { } /** * * @param head * @param k * @return * 找到輸入一個連結串列,輸出該連結串列中倒數第k個結點 * 連結串列只遍歷一次 */ public static ListNode FindKthToTail
(ListNode head, int k) { //魯棒性考慮 if (head==null||k==0){ //輸入空的情況 return null; } //定義兩個指標 ListNode first=head; ListNode second=head; //先讓第一個指標走k-1次 for (int i=0;i<k-1;i++){ if(first.next!=null){ first=first.next; System.out.println("firsrt:"+first.val
); }else { return null; //如果輸入的k值太大,比如求倒數第五個節點 連結串列長度為4 } } while (first.next!=null){ //然後兩個指標同時後走,當第一個指標走到尾的時候,第二個指標剛好就再k上面 first=first.next; second=second.next; } System.out.println("result:"+second.val); return second; } public static void main(String[] args) { ListNode node=new ListNode(1); node.next=new ListNode(2); node.next.next=new ListNode(3); node.next.next.next=new ListNode(4); node.next.next.next.next=new ListNode(5); node.next.next.next.next.next=new ListNode(6); ListNode r=FindKthToTail(node,5); } }