206.反转链表 92.翻转链表II

206反转链表

在这里插入图片描述

1.转为list反转再新建链表

class Solution:
    def getlist(self,head):
        l=[]
        while head:
            l.append(head.val)
            head=head.next
        return l
    def initList(self,list):
        head=ListNode()
        p=head
        for i in list:
            new=ListNode(val=i)
            p.next=new
            p=new
        return head.next
    def reverseList(self, head: ListNode) -> ListNode:
        l=self.getlist(head)
        return self.initList(l[::-1])

在这里插入图片描述

2.迭代

设置两个指针储存,由curr指向prev,每次向后移动一位
在这里插入图片描述
在这里插入图片描述
注意pre、cur、next指针的更新顺序

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        pre,cur=None,head
        while cur:
        	###需要先执行head.next,保证链表按原来顺序遍历,head相当于上图中的next指针####
            next=cur.next
            cur.next=pre
            pre=cur
            cur=next
        return pre

3.递归

①终止条件:只剩一个节点或没有节点时停止
②等价关系
在这里插入图片描述
reverse(head)=reverse(head.next)+改变head与head.next之间的指针关系

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if head is None or head.next is None:
            return head
        
        p = self.reverseList(head.next)
        head.next.next = head
        head.next = None

        return p

4.头插

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if head==None:
            return head
        else:
            new=ListNode(head.val,None)
            head=head.next
        while head:
            new=ListNode(head.val,new)
            head=head.next
        return new

在这里插入图片描述

92.翻转链表II

在这里插入图片描述

1.转成list,用双指针翻转部分list,再创建新链表

时间空间复杂度都为O(n)

class Solution(object):
    def getlist(self,head):
        l=[]
        while head:
            l.append(head.val)
            head=head.next
        return l
    def initLinkedlist(self,list):
        head=ListNode()
        p=head
        for i in list:
            new=ListNode(val=i)
            p.next=new
            p=new
        return head.next
    def reverseBetween(self, head, left, right):
        L=self.getlist(head)
        l,r=left-1,right-1
        while l<r:
            L[l],L[r]=L[r],L[l]
            l+=1
            r-=1
        return self.initLinkedlist(L)

2.先截断,倒序,再链接

class Solution(object):
    def reverseBetween(self, head, left, right):
        dummy=ListNode(next=head)
        ###指针p储存截断位置前一个节点####
        p,pleft,pright=dummy,head,head
        ###取出需要倒序的列表片段####
        for i in range(right-left):
            pright=pright.next
        for j in range(left-1):
            p,pleft,pright=p.next,pleft.next,pright.next
        ####suc保存截断位置的下一个节点###
        suc=pright.next
        pright.next=None###截断####
        ####倒序###################
        def reverseLinkedlist(head):
            if head==None or head.next==None:
                return head
            p=reverseLinkedlist(head.next)
            head.next.next=head
            head.next=None
            return p
        #####连接截断的链表#########
        p.next=reverseLinkedlist(pleft)
        while p.next:
            p=p.next
        p.next=suc
        return dummy.next

3.头插法

在需要翻转的链表片段,每次将原来第一个节点的下一个节点插入到片段之前,然后将该节点删除
注意pre,cur,next指针的更新顺序:
一定是先更新next=cur.next,然后依次按顺序更新(比如next=cur.next,下一步就要更新cur.next,cur.next=next.next,那么下一步更新next.next)

def reverseBetween(self, head, left, right):

        dummy_node = ListNode(-1)
        dummy_node.next = head
        pre = dummy_node
        for _ in range(left - 1):
            pre = pre.next

        cur = pre.next
        for _ in range(right - left):
            next = cur.next
            cur.next = next.next
            next.next = pre.next
            pre.next = next
        return dummy_node.next

三次结果由下到上依次是list,截断再拼接、头插法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值