福州網(wǎng)站怎么做的免費網(wǎng)站誰有靠譜的
一、24. 兩兩交換鏈表中的節(jié)點
題目:24. 兩兩交換鏈表中的節(jié)點 - 力扣(LeetCode)
視頻:幫你把鏈表細節(jié)學清楚! | LeetCode:24. 兩兩交換鏈表中的節(jié)點_嗶哩嗶哩_bilibili
講解:代碼隨想錄
dummy->1->2->3->
注意操作的順序:
① dummy->2
② 2->1
③ 1->3
class Solution {public ListNode swapPairs(ListNode head) {if(head == null || head.next == null) return head;ListNode dummy = new ListNode(-1);dummy.next = head; //1ListNode cur = dummy;ListNode slow, fast;while(cur.next != null && cur.next.next != null){ //3//在這里用cur同時定位slow和fast的相對位置 //2slow = cur.next;fast = slow.next.next;cur.next = slow.next;cur.next.next = slow;slow.next = fast;cur = slow;}return dummy.next;}
}
注意:
1、定義完虛擬頭結(jié)點之后,記得連在頭結(jié)點之前;
2、fast 和 slow 指針放在循環(huán)中,用cur同時定位slow和fast的相對位置,省了每次定位 fs 兩個指針的代碼;
3、這里不能寫成 ||,因為寫成 || 節(jié)點是奇數(shù)個就無法判斷到后面的條件
只要 cur.next
或 cur.next.next
中有一個不為 null
,循環(huán)就會繼續(xù)。這意味著即使 cur.next
為 null
,只要 cur.next.next
不為 null
,循環(huán)仍然會繼續(xù),這會導致 NullPointerException
,因為你試圖訪問 null
的 next
屬性。
嘗試過程:
class Solution {public ListNode swapPairs(ListNode head) {if(head == null || head.next == null) return head;ListNode dummy = new ListNode(-1);dummy.next = head; //ListNode cur = dummy;ListNode slow = head;ListNode fast = head.next.next;while(cur.next != null || slow.next != null){cur.next = slow.next;cur.next.next = slow;slow.next = fast;cur = slow;slow = fast;fast = slow.next.next; //這里有問題}return dummy.next;}
}
在處理鏈表成對交換時存在一些邏輯問題,特別是在更新fast
指針和處理鏈表末尾的部分,報了空指針異常。
解決辦法是:把 fast 和 slow 指針放在循環(huán)里改變
二、19.刪除鏈表的倒數(shù)第N個節(jié)點
題目:19. 刪除鏈表的倒數(shù)第 N 個結(jié)點 - 力扣(LeetCode)
視頻:鏈表遍歷學清楚! | LeetCode:19.刪除鏈表倒數(shù)第N個節(jié)點_嗶哩嗶哩_bilibili
講解:代碼隨想錄
雙指針的經(jīng)典應用
思路: 如果要刪除倒數(shù)第n個節(jié)點,讓fast移動n步,然后讓fast和slow同時移動,直到fast指向鏈表末尾。刪掉slow所指向的節(jié)點就可以了。
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {if(head == null) return null;ListNode dummy = new ListNode(-1, head); //1ListNode fast = dummy, slow = dummy;for(int i=0; i<=n; i++){ //2fast = fast.next;}while(fast!=null){ //3fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return dummy.next; }
}
注意:
1、接在 head 之前用這一步寫就行: 初始化一個空結(jié)點,初始賦值為0,并且list的下一個next指針指向head,指針指向為list: ListNode list=new ListNode(0,head);
2、注意終止條件,如果是 i<=n,加上=,slow 指針到時可以剛好停在刪除元素的前一個節(jié)點
3、終止條件是 fast 判空,不是 fast.next 判空
嘗試過程:
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {if(head == null) return -1; //1ListNode dummy = new ListNode(-1, head);ListNode fast = dummy, slow = dummy;for(int i=0; i<=n; i++){fast = fast.next;}while(fast.next!=null){ //2fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return dummy.next;}
}
1、返回值類型錯誤:如果鏈表為空,應該返回null
而不是-1
,因為-1
不是一個有效的鏈表節(jié)點。
2、見上面
三、面試題 02.07. 鏈表相交
同:160.鏈表相交
題目:面試題 02.07. 鏈表相交 - 力扣(LeetCode)
視頻:
講解:代碼隨想錄
四、142.環(huán)形鏈表II
題目:142. 環(huán)形鏈表 II - 力扣(LeetCode)
視頻:把環(huán)形鏈表講清楚! 如何判斷環(huán)形鏈表?如何找到環(huán)形鏈表的入口? LeetCode:142.環(huán)形鏈表II_嗶哩嗶哩_bilibili
講解:代碼隨想錄