最近課程比較緊張,中秋放假休息了兩天,回來繼續刷演算法題。鍊錶翻轉是個比較常見的型別,要吃透。
力扣第92題:題目描述:反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。
說明:1≤ m ≤ n ≤ 鍊錶長度。
示例:
輸入: 1->2->3->4->5->null, m = 2, n = 4輸出: 1->4->3->2->5->null
思路:
用指標記錄要反轉區間的首尾節點,在寫乙個反轉區域性區間m到n的函式,在將反轉後的鏈結起來
publicstatic listnode reversebetween(listnode head, int m, int
n)
//pre即為區域性反轉的煉表頭節點
tail.next =pre;
//找到反轉鍊錶的最後乙個節點
while (pre.next != null
)
//鏈結起來
pre.next =next;
return
phead.next;
}
力扣第25題:k個一組反轉鍊錶
題目描述:
給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。
k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。
示例:
給定這個鍊錶:1->2->3->4->5當 k = 2 時,應當返回: 2->1->4->3->5當 k = 3 時,應當返回: 3->2->1->4->5
說明:
思路:用指標記錄需要反轉部分你的頭尾節點,寫乙個區域性反轉的函式,每k個反轉一次,不夠k個就返回
publicstatic listnode reversekgroup(listnode head, int
k) listnode next =currentnode.next;
//對區域性鍊錶進行反轉
reverse(head,currentnode);
//遞迴接著每k個反轉一次
head.next =reversekgroup(next,k);
return
currentnode;
}public
static
listnode reverse(listnode head,listnode tail)
return
head;
}
力扣第143題:重排鍊錶
題目描述:
給定乙個單鏈表 l:l0→l1→…→l**n-1→ln , 將其重新排列後變為: l0→l**n→l1→l**n-1→l2→l**n-2→…
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例:
給定鍊錶 1->2->3->4, 重新排列為 1->4->2->3.給定鍊錶 1->2->3->4->5, 重新排列為 1->5->2->4->3.
思路:尋找到鍊錶的中間節點,將鍊錶分為兩段,將後半部分反轉,在將兩個鍊錶合併
publicstatic
void
reorderlist(listnode head)
//將鍊錶分為兩段
p2 =p1.next;
p1.next = null
; p1 =head;
//將後半段鍊錶進行反轉
listnode pre = null
; listnode next = null
; listnode head2 =p2;
while (head2 != null
) p2 =pre;
//合併兩個鍊錶
listnode next1;
listnode next2;
while (p2 != null
) }
鍊錶 反轉鍊錶
問題 兩兩交換鍊錶中的節點 問題 k 個一組翻轉鍊錶 問題鏈結 利用棧先進後出的特性,遍歷鍊錶,將每個結點加入棧中,最後進行出棧操作,先出棧的結點指向臨近的後出棧的結點。definition for singly linked list.struct listnode class solution ...
反轉鍊錶與分組反轉鍊錶
經典的反轉鍊錶,先上 public class listnode public class printlist system.out.println public class reverse public listnode reverse listnode root listnode pre nul...
鍊錶 鍊錶反轉I
package com.hnust.reversal public class listnode public listnode int value,listnode next override public string tostring 我們可以通過把鍊錶中鏈結節點的指標反轉過來,從而改變鍊錶的...