1. 程式人生 > >輸出單鏈表中倒數第k個結點(Java版)

輸出單鏈表中倒數第k個結點(Java版)

題目:輸入帶頭結點的單鏈表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;
	}