• Leetcode-反转链表


    206.反转一个单链表。

    示例:

    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL
    

    思路

    涂鸦中序号表示思考的顺序,实际执行还是126345

    1. 创建一个节点pre指向Null
    2. 创建节点cur指向head
    3. 反转指向,将pre作为cur的下一节点,cur.next = pre
    4. pre节点后移,pre = cur
    5. cur节点后移(cur = cur.next)由于步骤3已经令cur.next=pre,所以需要提前缓存cur的下一节点,cur = temp
    6. 提前缓存cur的下一节点,temp = cur.next
    

    代码:

    def reverseList(head:ListNode):
        pre = None
        cur = head
        while cur:
            temp = cur.next
            cur.next = pre
            pre = cur
            cur = temp
         return pre
    

    打怪升级难度

    92.反转链表 II

    反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

    说明:
    1 ≤ m ≤ n ≤ 链表长度。

    示例:

    输入: 1->2->3->4->5->NULL, m = 2, n = 4
    输出: 1->4->3->2->5->NULL
    

    思考:

    刚才完全反转链表,将(pre)指向了(null),现在可以把(pre)指向(m-1)节点,那(n)怎么处理呢?

    恩~,如果遍历到(n)就停止,把剩下的接到新链表应该就可以了

    创建pre,cur指针 分别指向None和head,后移直到cur指向m位置

    反转子链表,直到pre走到n位置,拼起来

    1. 创建pre,cur指针 分别指向None和head
    2. pre和cur一起后移,直到cur到m位置。可以看到在子链表反转后,cur会接到未反转部分,pre接到反转后子链表的头部。保存下cur和pre记录为tail和con
    3. 反转子链表,直到pre走到n位置
    4. 拼起来
    

    coding

    def reverseList2(head:ListNode,m,n):
        pre, cur = None,head
        index = 1
        while index < m:
            pre = cur
            cur = cur.next
            index += 1
    
        con,tail = pre,cur
    
        while index <= n:
            temp = cur.next
            cur.next = pre
            pre = cur
            cur = temp
            index += 1
    
        if con:
            con.next = pre
        else:
            head = pre
        tail.next = cur
    
        return head
    
    
  • 相关阅读:
    2019年CSP-J初赛试题(普及组)试题详解
    开放课件
    猴子选大王 (约瑟夫问题)
    后缀表达式转中缀表达式
    JDBC的使用
    JDBC
    MySQL第五天
    MySQL第四天
    MySQL第三天
    MySQL第二天
  • 原文地址:https://www.cnblogs.com/gongyanzh/p/12400457.html
Copyright © 2020-2023  润新知