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

24这题之前也做过,有点印象,但是写得也并不顺利,解题需要注意如下三点:

  1. dummy_head的使用,是为了方便头节点操作,要明白这点,也就知道后续return的时候应该是return dummy_head.next
  2. 关于对链表进行操作时,要记住,需要操作某一个节点,那么就必须知道这个节点的前提个节点,删除操作或是交换节点位置的操作均是如此,所以cur起初要等于dummy_head而不是head
  3. 根据交换逻辑,进行操作后的链表,cur.next;cur.next.next都在改变,所以相应操作的节点也改变,要正确操作就需要用两个变量提前存下cur.next和cur.next.next.next

明确后,第一次写完如下代码:

 def swapPairs(selfhead):

        #创建一个虚拟头节点

        dummy_head=ListNode(next=head)

        cur=dummy_head

        while(cur.next.next!=None):

           tmp1=cur.next.next.next

           tmp2=cur.next

           cur.next=cur.next.next

           cur.next.next=tmp2

           tmp2.next=tmp1

           cur=cur.next.next

        return dummy_head.next

但是答案不对,报了nonetype错误,问题出在while循环

代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点_第1张图片

 

当出现上图情况的时候,cur.next不在存在next属性,看卡尔视频学到可以利用条件判断规避这个错误,改为

while(cur.next!=None and cur.next.next!=None)

首先判断,cur.next!=None,再判断后续条件,肯定就存在Next属性

顺利AC啦~

下一题是19.删除链表的倒数第N个节点

这题的关键在于,如何找到倒数第N个节点的前一个节点,能找到就能删除;

可以用两个指针,使其相对位置相差N,当快指针走到头(fast.next==None),此时慢指针就是倒数N-1个节点,即可进行删除操作

代码如下:

def removeNthFromEnd(selfheadn):

        """

        :type head: ListNode

        :type n: int

        :rtype: ListNode

        """

        dummy_head = ListNode(next=head)

        fast = slow = dummy_head

        for _ in range(n):

            fast=fast.next

        while(fast.next!=None):

            slow=slow.next

            fast=fast.next

        slow.next=slow.next.next

        return dummy_head.next

但是删掉的节点不对,循环改为for _ in range(n),删除节点正确,有个问题是python区间是左闭右开,取不到最右侧值,所以应该是n而不是n-1

你可能感兴趣的:(代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点)