語言
采用的Java語言,一些分析也是用于Java,請注意。
?24.?兩兩交換鏈表中的節點?
24. 兩兩交換鏈表中的節點 - 力扣(LeetCode)
解題
這道題就是考驗鏈表的基礎操作,但是有個語言方面的知識需要去掌握,就是||? |? &&? &的這幾個的區別,對于這道題影響還是比較大的,我看好多人在問這個
class Solution {public ListNode swapPairs(ListNode head) {ListNode dummy = new ListNode(0,head);ListNode cur = dummy;//dummy 1 2 3 4 5while(cur.next!=null&&cur.next.next!=null){ListNode temp1 = cur.next;//1ListNode temp2 = cur.next.next.next;//3cur.next = cur.next.next;//2cur.next.next=temp1;temp1.next=temp2;cur=cur.next.next;}return dummy.next;}
}
這里說一下:
解釋為什么用&&和空指針問題
這里為什么用&&:(cur.next!=null && cur.next.next !=null)
1、說明了當奇數節點的時候,比如指向4 后面還有個5的時候,cur.next!=null ,但是cur.next.next==null,第二個不滿足條件,就不會在做循環里的反轉,若是||的時候,就會把5也給做判斷,但實際上是不需要判斷的
2、當偶數個節點的時候,4 后面沒有5,那么cur.next==null不滿足第一個條件,直接就會結束
3、注意&&和&的區別,&&的時候,第一個不成立,下一個就不會執行,所以說,cur.next==null了,cur.next.next就不會執行,不用考慮空指針的問題,所以這兩個的位置不能交換
19.刪除鏈表的倒數第N個節點?
19. 刪除鏈表的倒數第 N 個結點 - 力扣(LeetCode)
這到題就注意一下先走n+1步,慢節點就可以倒刪除元素的前一個
比如
1? ?2? ? 3
倒數1個節點
fast=2(1+1) slow=1
fast=3 slow =2
fast=null 循環停止,此時slow=2
slow.next = slow.next.next就把3刪掉。
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0,head);ListNode fast = dummy;ListNode slow = dummy;//多走1步,slow就會在上一個節點n++;while(n-->0){fast=fast.next;}while(fast!=null){fast=fast.next;slow=slow.next;}slow.next=slow.next.next;return dummy.next;}
}
?面試題?02.07.?鏈表相交?
這道題就是讓長的鏈表先移動幾個距離,和短的鏈表保持一樣,然后一起移動就可以了,并沒有什么難度。
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {int lenA=0;int lenB=0;ListNode curA=headA;ListNode curB=headB;while(curA!=null){lenA++;curA=curA.next;}while(curB!=null){lenB++;curB=curB.next;}ListNode shortLen=null;ListNode longLen = null;if(lenA<lenB){shortLen=headA;longLen=headB;}else {shortLen=headB;longLen=headA;}int len= lenA>lenB?lenA-lenB:lenB-lenA;while (len-->0){longLen=longLen.next;}while(shortLen!=null&&longLen!=null){if(shortLen==longLen){return shortLen;}shortLen=shortLen.next;longLen=longLen.next;}return null;}
?142.環形鏈表II?
142. 環形鏈表 II - 力扣(LeetCode)
這道題呢,就是判斷鏈表有環和找到入環的位置,主要難理解一個為什么slow指針被追上的時候肯定沒到1圈,通俗的一句話就是,你在操場跑步,我是你的二倍速,那么你跑一圈,我肯定跑完兩圈了,之間肯定會有交點。
還有就是為什么會相遇,這個更簡單了,入環的之后,兩者的相對速度是1,相當于走一次,距離就近了一次,肯定會相遇
public class Solution {public ListNode detectCycle(ListNode head) {ListNode slow = head;ListNode fast = head;while(fast!=null&&fast.next!=null){slow = slow.next;fast = fast.next.next;if(slow==fast){ListNode head1 = head;while(slow!=head1){head1 = head1.next;slow = slow.next;}return head1;}}return null;}
}
總結(重點!!卡哥遺漏)
鏈表總結的話,主要就是虛擬頭節點使用,然后就是一些邊界處理這里一定要注意,需要有自己的總結,比如說這篇文章24題,我強調的&&號的使用在這道題的意義,這個是需要著重理解的。
以及&&號使用之后,需要注意while循環里的條件是否需要注意空指針的問題,比如24題中,
1 2 3 4?
cur是4 ,cur.next為null,那么因為&&,后面是不會再去判斷的,
因為&&,前面是否,那么直接結束循環了,因此不會有空指針的問題,但是cur.next.next放前面就會了,這是值得注意的
?1 2 3 4 5
cur是4,cur.next不為null,接著才會處理cur.next.next發現為null,也跳出循環,符合我們的要求,這也是視頻中很多人在問| |號行不行,我在這里解釋一下!。
另外,對于類似的這樣問題,我在Day3也有做闡述,可以去關注,將在文章末尾去做。可能看的時候還沒做,我需要時間分析思考,關注即可。