輸出單鏈表中倒數第k個結點(Java版)
阿新 • • 發佈:2019-01-08
題目:輸入帶頭結點的單鏈表L,輸出該單鏈表中倒數第k個結點。單鏈表的倒數第0個結點為該單鏈表的尾指標。要求只能遍歷一次單鏈表。
解題思路:
如果不要求只能遍歷一次單鏈表,我們可以先遍歷一次單鏈表,求出它的結點的總個數n(包括頭結點),所以單鏈表的結點是從倒數第n-1個到倒數第0個,然後再遍歷一次單鏈表,遍歷時訪問的第n-k-1個結點就是該單鏈表中倒數第k個結點。現在要求只能遍歷一次單鏈表,可以設兩個指標p和q,最開始時它們都指向頭結點,然後p向後移動k位,最後p,q同時向後移動直到p為最後一個結點,那麼此時q即為所求。
ADT定義:
//單鏈表的結點類 class LNode{ //為了簡化訪問單鏈表,結點中的資料項的訪問許可權都設為public public int data; public LNode next; }
演算法實現:
public class LinkListUtli { //求單鏈表倒數第k個結點,尾指標為倒數第0個結點 public LNode reciprocalKNode(LNode L, int k) { if (k < 0) { System.out.println("k不可以為負數"); return null; } if (L == null) { System.out.println("單鏈表為空"); return null; } LNode p = L; LNode q = L; while (k > 0) { p = p.next; if (p == null) { System.out.println("單鏈表太短,不存在倒數第k個結點"); return null; } } while (p.next != null) { p = p.next; q = q.next; } return p; }