二刷复习
文章目录
- 二刷复习
 - 24.两两交换链表中的结点
 - 19.删除链表的倒数第n个结点
 - 链表相交
 - 环形链表2
 
24.两两交换链表中的结点
思路还是挺简单的,在纸上画一个图就行了
 
 思考的过程:
 1.我会思考需要用一个指针curr还是两个指针prev和curr,思考的结果是一个curr就够了
 2.我接下来会思考用不用dummy_head,思考的结果是用,方便操作头结点
 3.我接下来就考虑指针是怎么指的,怎么断开,又怎么连,需要提前保存一下哪些指针
 4.我接下来思考curr指针是怎么移动的以及,while怎么写。这一步我出错了,我一开始写的是 while curr.next.next: 后来报错nonetype;这一点应该属于是首先你要保证while curr.next, 就是头结点都没的情况 直接不进循环逻辑直接return dummy_head.next, 其次你再保证curr.next.next,就是只有一个头结点的情况也直接返回dummy_head。
所以循环条件是
while curr.next and curr.next
 
class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        dummy_head = ListNode(next=head)
        curr = dummy_head
        
        while curr.next and curr.next.next:
            tmp1 = curr.next
            tmp2 = curr.next.next.next
            curr.next = curr.next.next
            curr.next.next = tmp1
            curr.next.next.next = tmp2
            curr = curr.next.next
        return dummy_head.next
 
19.删除链表的倒数第n个结点
19.删除链表的倒数第n个结点
这道题的难点在于找到倒数第n个结点前一个结点的位置,之所以找不到是因为不能获知链表的长度
解法是双指针,
 fast先走n+1步, 然后slow再和它一起走直到fast指向None
 此时slow指向的就是倒数第n+1个结点,就可以直接操作指针了
这个思路一定要记住
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        dummy = ListNode(next=head)
        slow, fast = dummy, dummy
        while n+1:
            fast = fast.next
            n -= 1
        while fast:
            fast = fast.next
            slow = slow.next
        slow.next = slow.next.next
        return dummy.next
 
链表相交
链表相交
这个题的思路十分简单,
可以把一条链表完全加进一个set或者hash表(这两个底层都是一样的);然后遍历另外一支,如果发现遍历的另外一支中有出现在set里的就return 那个指针 否则就return None
class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        a = set()
        curr_a = headA
        while curr_a:
            a.add(curr_a)
            curr_a = curr_a.next
        
        curr_b = headB
        while curr_b:
            if curr_b in a: return curr_b
            else: 
                curr_b = curr_b.next
        return None
 
环形链表2
环形链表2
 不管是环形链表2还是链表相交思路都是一样的
class Solution:
    def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
        a = set()
        curr = head
        while curr:
            a.add(curr)
            curr = curr.next
            if curr in a: return curr
        return None
                




![多道程序与分时多任务--rCore[3]](https://img-blog.csdnimg.cn/e0c44a6de49c4718807f4277eafd5b70.png)







![刷题记录:牛客NC24858Job Hunt [最长路+两种不同判环详解]](https://img-blog.csdnimg.cn/778547c8f43643a98462d8824501961d.png#pic_center)




