• LeetCode 206.反转链表


    反转一个单链表。

    #
    # @lc app=leetcode.cn id=206 lang=python3
    #
    # [206] 反转链表
    #
    
    # @lc code=start
    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    # 优先使用迭代法1,因为迭代法1在整个过程中没有拆断链表
    # 迭代法1
    class Solution:
        def reverseList(self, head: ListNode) -> ListNode:
            """
            input:1,2,3,4,5
            pre,1(cur),2(tmp),3,4,5
            pre,2,1(cur),3,4,5
            pre,3,2,1(cur),4,5
            pre,4,3,2,1(cur),5
            pre,5,4,3,2,1(cur)  当cur.next is None时,终止循环
            """
            if head is None or head.next is None:
                return head
            pre = ListNode(None)
            pre.next = head
            cur = head
            while cur.next:
                tmp = cur.next
                cur.next = tmp.next         
                tmp.next = pre.next
                pre.next = tmp
            return pre.next 
    
    # 迭代法2
    # input:1,2,3,4,5
    # Process :
    # new_head = None       cur = 1,2,3,4,5
    # new_head = 1          cur = 2,3,4,5
    # new_head = 2,1        cur = 3,4,5
    # new_head = 3,2,1      cur = 4,5
    # new_head = 4,3,2,1    cur = 5
    # new_head = 5,4,3,2,1  cur = None
    class Solution:
        def reverseList(self, head: ListNode) -> ListNode:
            cur = head
            new_head = None
            while cur:
                tmp = cur.next
                cur.next = new_head
                new_head = cur
                cur = tmp
            return new_head
    # 递归法
    """
    子问题是什么
    base case是什么
    在当前层要干什么
    对翻转链表来说,以1->2->3->4->5为例:
    子问题是:除去current node,翻转剩余链表,即除去1, reverseList(2->3->4->5),递归得到的解是 5->4->3->2
    base case:当前节点为空,返回空,当前节点的next为空(只剩余一个节点),返回该节点
    在当前层要干什么:翻转链表,即把1->2变为2->1.
    最后return的是结果链表的头,也就是递归解的头。
    """
    class Solution:
        def reverseList(self, head: ListNode) -> ListNode:
            """
            递归三要素:
                  返回条件: 头节点为空或头节点next节点为空
                  子问题:对head.next子链表进行反转
                  当前层的处理:head.next子链表反转后的头节点是node,尾节点是head.next,需要将head节点链在head.next尾部,并将head.next置空
            """
            if head is None or head.next is None:
                return head
            node = self.reverseList(head.next) ## 对子链表进行反转
            head.next.next = head  # head.next 是子链表的尾节点,连接上新的尾节点head
            head.next = None # 新的尾节点置为None
            return node # 返回新的头节点
    
    
  • 相关阅读:
    traceroute原理
    IP转发和子网路由
    Dijkstra算法
    String源码学习
    多线程的参数传递
    hbase参数配置优化
    hadoop 点点滴滴(一)
    Win8安装教程!笔记本用U盘安装Win8只需三步
    CentOS 6.4下编译安装MySQL 5.6.14
    Nginx配置文件说明
  • 原文地址:https://www.cnblogs.com/sandy-t/p/12949096.html
Copyright © 2020-2023  润新知