【題目】
分別實(shí)現(xiàn)兩個(gè)函數(shù),一個(gè)可以刪除單鏈表中倒數(shù)第k個(gè)節(jié)點(diǎn),另一個(gè)可以刪除雙鏈表中倒數(shù)第k個(gè)節(jié)點(diǎn)。
【解析】
先來分析單鏈表,如果鏈表為空或者k值小于1,這種情況下參數(shù)是無效的,直接返回結(jié)果。
讓鏈表從頭開始走向尾,每移動(dòng)一步,就讓k的值減1.
例如:1->2->3,k=4,鏈表根本不存在倒數(shù)第4個(gè)節(jié)點(diǎn)。走到的節(jié)點(diǎn):1->2->3;K值變化為:3 2 1
例如2: 1->2->3,k=3,鏈表倒數(shù)第三個(gè)節(jié)點(diǎn)是1.走到的節(jié)點(diǎn):1->2->3;k值變化為:2 1 0
例如3: 1->2->3,k=2,鏈表倒數(shù)第二個(gè)節(jié)點(diǎn)是2節(jié)點(diǎn),走到的節(jié)點(diǎn):1->2->3;k值變化:1 0 -1
以上三種情況可知:讓鏈表從頭開始走向尾,每移動(dòng)一步,就讓k值減1,當(dāng)鏈表走到尾部時(shí),如果k>0,說明不用調(diào)整鏈表,因?yàn)殒湵砀緵]有倒數(shù)第k個(gè)節(jié)點(diǎn)。
如果k=0,說明鏈表倒數(shù)第k個(gè)節(jié)點(diǎn)就是頭節(jié)點(diǎn),此時(shí)直接返回head.next,也就是原鏈表的第二個(gè)節(jié)點(diǎn),讓第二個(gè)節(jié)點(diǎn)作為鏈表的頭返回即可,相當(dāng)于刪除頭節(jié)點(diǎn),接下來,說明一下k<0該如何處理:
先明確一點(diǎn),如果刪除的節(jié)點(diǎn)是頭節(jié)點(diǎn)之后的某一個(gè)節(jié)點(diǎn),需要找到要?jiǎng)h除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)。例如:1->2->3如果刪除的是2,則需要找到節(jié)點(diǎn)1,然后把節(jié)點(diǎn)1鏈接到節(jié)點(diǎn)3上(1->3),此時(shí)達(dá)到刪除節(jié)點(diǎn)2的目的。
如果k<0如何找到要?jiǎng)h除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)?方法如下:
1.重新從頭節(jié)點(diǎn)開始走,每移動(dòng)一步,就讓k的值加1.
2.當(dāng)k=0時(shí),移動(dòng)停止,移動(dòng)到的節(jié)點(diǎn)就是要?jiǎng)h除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)。
【代碼實(shí)現(xiàn)】
public static Node removeLastKthNode(Node head,int lastKth){
//參數(shù)判斷
if (head == null || lastKth <1) {
return head;
}
Node cur = head;
while (cur != null) {
lastKth--;
cur = cur.next;
}
if (lastKth == 0) {
head = head.next;
}
if (lastKth < 0) {
cur = head;
while (++lastKth != 0) {
cur = cur.next;
}
cur.next = cur.next.next;
}
return head;
}