数据结构算法——链表

一、反转链表

在这里插入图片描述

  • 要点:代码可以极度简洁(4行)
    在这里插入图片描述

二、两两对换

在这里插入图片描述

  • 要点:需要4个指针
    在这里插入图片描述

  • 题解:
    为什么需要4个指针?
    1、一个用来做真正的头指针
    2、一个用来作为每次动刀的标志位(并且作为要屡回两两交换后的和前束的链接,因为两两交换只完成了后续指针链接的变动,没有纠正前束)
    3、两个用来交换指针

三、是否有环

在这里插入图片描述

1、命中自己
2、龟兔赛跑

  • 要点:循环的条件注意不要error
    在这里插入图片描述

四、二叉树展开为链表(Leetcode 114)

在这里插入图片描述

4.1 解法1(前序遍历全保存下来,再连成链表)

*时间复杂度O(N)
*空间复杂度O(N)

class Solution:
    def flatten(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        self.ret = TreeNode(0)
        self.cur = self.ret
        self.stack = []
        if not root:
            return root
        self.DFS_reverse(root)
        if len(self.stack)<=1:
            return root
        for v in self.stack:
            self.cur.right = v
            v.left = None
            v.right = None
            self.cur = self.cur.right

        return self.ret.right

    def DFS_reverse(self, root):
        self.stack.append(root)
        if root.left:
            self.DFS_reverse(root.left)
        if root.right:
            self.DFS_reverse(root.right)

4.2 解法2(用栈,一边前序遍历一边连成链表)

*时间复杂度O(N)
*空间复杂度O(N)

class Solution:
    def flatten(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        if not root: return root
        stack = [root]
        pre = TreeNode(0)
        # DFS
        while stack:
            cur = stack.pop()
            if cur.right:
                stack.append(cur.right)
            if cur.left:
                stack.append(cur.left)
            pre.right = cur
            pre.left = None
            pre = cur
        return root

4.3 解法3(直接在树上改造)

*时间复杂度O(N)
*空间复杂度O(1)

class Solution:
    def flatten(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        cur = root
        while cur:
            if cur.left:
                pre = nxt = cur.left
                while pre.right:
                    pre = pre.right
                pre.right = cur.right
                cur.left = None
                cur.right = nxt
            cur = cur.right
        return root
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值