題目:
定義一個(gè)函數(shù),輸入一個(gè)鏈表的頭結(jié)點(diǎn),反轉(zhuǎn)該鏈表并輸出反轉(zhuǎn)后鏈表的頭結(jié)點(diǎn)。
思路:
定義三個(gè)指針,分別指向當(dāng)前遍歷的結(jié)點(diǎn)pNode、它的前一個(gè)結(jié)點(diǎn)pPrev、它的后一個(gè)結(jié)點(diǎn)pNext。
1)為避免鏈表斷開(kāi),每次遍歷,先保存后一個(gè)結(jié)點(diǎn)pNext。如果pNext==null,證明當(dāng)前結(jié)點(diǎn)pNode是最后一個(gè)結(jié)點(diǎn),即反轉(zhuǎn)鏈表的頭節(jié)點(diǎn)。
2)將當(dāng)前結(jié)點(diǎn)pNode的next指向它的前一個(gè)結(jié)點(diǎn)pPrev。
3)所有指針后移一位。
自述(僅自己理解):循環(huán)過(guò)程中,如果判斷條件不被判斷塊使用,同時(shí)僅在非判斷塊中起作用并且非判斷塊的代碼和判斷塊的代碼冗余,那么判斷條件無(wú)用。
- 舉例:在while條件中,我使用了pNode != null的判斷條件,是因?yàn)樵跅l件塊中使用了ListNode pNext = pNode.next;
如果我在while判斷使用pNode.next != null,那么條件塊沒(méi)有使用到該判斷,而且非條件塊還需要寫一段冗余代碼。證明此判斷條件不夠精準(zhǔn),還需提煉。
解答:
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode pReverseHead = null;
//三個(gè)指針:前面一位,當(dāng)前,下一個(gè)指針
ListNode pPrev = null;
ListNode pNode = head;
while (pNode != null) {
//保存第三個(gè)指針
ListNode pNext = pNode.next;
if (pNext == null) {
pReverseHead = pNode;
}
//反轉(zhuǎn)指針指向
pNode.next = pPrev;
//向后移動(dòng)位置
pPrev = pNode;
pNode = pNext;
}
return pReverseHead;
}
}