1. 程式人生 > >牛客網刷題之連結串列中倒數第k個結點

牛客網刷題之連結串列中倒數第k個結點

題目描述:

  這裡寫圖片描述

解題思路:

  強解法:先遍歷連結串列得出所有節點的個數n,再遍歷一次得到n-k+1節點就是所得到的結果,這一共遍歷了兩次,這基本是不能通過測試的,當然也不會是我們想要的;
  看到倒數兩個字有沒有想到棧的先進後出特點,那我們是不是可以先將連結串列中的節點取出來push進棧中,然後取pop出k個節點,那麼第k個節點就是所要求的?答案是可以的!!!

public ListNode FindKthToTail(ListNode head,int k) {
        ListNode result = null;
        if(head == null || k <= 0
){ return null; } Stack<ListNode> s = new Stack<>(); while(head != null){ s.push(head); head = head.next; } for(int i = 0 ; i < k ; i ++){ if(!s.isEmpty()){ result = s.pop(); }else
{ result = null; } } return result; }

測試結果:
這裡寫圖片描述

  其實,我們要做的就是要減少遍歷次數從而對程式進行優化,可以定義兩個指標,同時指向頭節點,先讓第一個指標走k-1步,然後第二個指標才開始往後移動,當第一個指標到達連結串列終點,那麼第二個指標剛好走了k-1步,也就是倒數第k個節點。這就好比移尺子運算,兩個指標始終相差k-1個節點。

題解:

 public ListNode FindKthToTail(ListNode head,int k) {
        ListNode first = head;
        ListNode sec = head;
        if
(head == null || k <= 0){ return null; } for(int i = 0 ; i < k-1 ; i ++){ if(first.next != null){ first = first.next; }else{ return null; } } while(first.next != null){ first = first.next; sec = sec.next; } return sec; }

ac結果:

這裡寫圖片描述