代码随想录二刷day4 24.两两交换链表中的结点 19.删除链表的倒数第n个结点 链表相交(环形链表)

本文介绍了链表相关的三种算法问题:两两交换链表中的节点、删除链表的倒数第n个节点以及判断链表相交。通过详细解析解题思路,包括使用双指针法解决链表问题,以及利用集合快速查找交点。这些方法对于理解和解决链表问题具有指导意义。
摘要由CSDN通过智能技术生成

二刷复习



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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值