題目:輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大家的習慣,從1開始計數,即鍊錶的尾節點是倒數第乙個結點。
演算法思路:定義兩個指標,先讓第乙個指標和第二個指標都指向頭結點,然後,讓第乙個指標走k-1步,指向第k個結點;
接著,兩個指標同時移動,當第乙個結點到達末尾的時候,第二個結點所在的位置就是倒數第k個結點。
注意:**的魯棒性。1.判斷頭指標是否為空;判斷k值是否小於等於0;結點的個數有可能少於k
變形:求鍊錶的中間結點;判斷乙個單向鍊錶是否形成了環形結構。
可執行**:
/*
public class listnode
}*/public class solution
listnode pre = head, last = head;
for(int i = 0;i < k - 1;i++)else
}while(pre.next!=null)
return last;
}}
1.求鍊錶的中間結點。如果鍊錶的結點總數為奇數,返回中間結點;如果結點總數為偶數,返回中間兩個結點的任意乙個。
思路:定義兩個指標,同時從鍊錶的頭結點開始出發,乙個指標一次走一步,另乙個指標一次走兩步。當走得快的指標走到鍊錶末尾的時候,走得慢的指標正好在鍊錶的中間。
public static listnode findmidnode(listnode head)
listnode pre = head,last = head;
while(last.next != null)else
pre = pre.next;
} return pre;
}
2.判斷乙個單向鍊錶中是否存在環路。
思路:定義兩個指標,同時從鍊錶的頭結點開始出發,乙個指標一次走一步,另乙個指標一次走兩步。如果走得快的指標追上了走得慢的指標,那麼鍊錶就是環形鍊錶。如果走的快的指標走到了鍊錶的末尾,都沒有追上第乙個指標,那麼鍊錶就不是環形.
public static booleanisring(listnode head)
listnode pre = head,last = head;
while(last.next != null)else
if(last.next.next == pre)
pre = pre.next;
} return false;
}
鍊錶 合併兩個有序鍊錶
標籤 鍊錶 題目描述 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。解題思路 兩種解法 遞迴和非遞迴 拓展 參考 public listnode merge listnode list1,listnode list2 else 非遞迴 public li...
兩個鍊錶生成相加鍊錶
假設鍊錶中每乙個節點的值都在 0 9 之間,那麼鍊錶整體就可以代表乙個整數。給定兩個這種鍊錶,請生成代表兩個整數相加值的結果鍊錶。例如 鍊錶 1 為 9 3 7,鍊錶 2 為 6 3,最後生成新的結果鍊錶為 1 0 0 0。示例1 9,3,7 6,3 struct listnode class so...
兩個鍊錶生成相加鍊錶
假設鍊錶中每乙個節點的值都在 0 9 之間,那麼鍊錶整體就可以代表乙個整數。給定兩個這種鍊錶,請生成代表兩個整數相加值的結果鍊錶。例如 鍊錶 1 為 9 3 7,鍊錶 2 為 6 3,最後生成新的結果鍊錶為 1 0 0 0。示例1 9,3,7 6,3 方法二 使用棧,不需要反轉鍊錶 public l...