代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 142.环形链表II

文档讲解:代码随想录

视频讲解:代码随想录B站账号

状态:看了视频题解和文章解析后做出来了

 24. 两两交换链表中的节点

 题目:给定一个链表,将两两节点的指向翻转

class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        dummy_node = ListNode(next=head)
        cur = dummy_node

        while cur.next and cur.next.next:
            temp = cur.next
            temp2 = cur.next.next.next
            cur.next = cur.next.next
            cur.next.next = temp
            cur.next.next.next = temp2

            cur = cur.next.next

        return dummy_node.next

核心思路:只有当前节点为需交换的两个节点之前,才可对这两个节点进行操作。所以设置一个dummy_head,用于处理第一二个节点的交换,同时保证了整个链表的交换操作统一。

代码细节:

1. 终止条件:当链表的节点数为偶数时,当cur.next为空则终止。当链表的节点数为奇数时,当cur.next.next为空则终止,虽然cur.next还有一个节点,但此节点无需做交换处理。在写while条件的时候,记得要用and的short circuit形式,并且把偶数节点的终止条件写在前面,这样就可以避免偶数节点去判断cur.next.next导致空节点报错。

2. 在重新指向cur.next之前,需要提前把cur.next的当前节点和cur.next.next.next存储到分别两个变量里,不然就无法追踪到这些节点了。

3. 每次循环后,将cur往后移动两位。

19.删除链表的倒数第N个节点

class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        dummy_head = ListNode(next=head)

        fast = dummy_head
        slow = dummy_head

        for i in range(n+1):
            fast = fast.next

        while fast:
            fast = fast.next
            slow = slow.next

        slow.next = slow.next.next

        return dummy_head.next

这题其实没什么好说的,如果没思路这辈子也做不出来,有思路的话代码实现还是比较简单的。

首先定义两个指针,让快指针往前移动n+1次,这样快指针在指向null的时候,慢指针正好指向需要删除对象的前一位,方便操作。

你可能感兴趣的:(链表,数据结构)