• [LeetCode] 92. Reverse Linked List II 反向链表II


    Reverse a linked list from position m to n. Do it in-place and in one-pass.

    For example:
    Given 1->2->3->4->5->NULLm = 2 and n = 4,

    return 1->4->3->2->5->NULL.

    Note:
    Given mn satisfy the following condition:
    1 ≤ m ≤ n ≤ length of list.

    206. Reverse Linked List的拓展,这里只是反向一个链表中的一部分。先建立一个新list node: dummy,用dummy链接m之前不用反向的node,然后反向m~n的节点,最后在把反向的连接起来。

    Java:

    /**
     * Definition for ListNode
     * public class ListNode {
     *     int val;
     *     ListNode next;
     * }
     */
    public class Solution {
        public ListNode reverseBetween(ListNode head, int m, int n) {
            if (m >= n || head == null) {
                return head;
            }
            
            ListNode dummy = new ListNode(0);
            dummy.next = head;
            head = dummy;
            
            for (int i = 1; i < m; i++) {
                if (head == null) {
                    return null;
                }
                head = head.next;
            }
            
            ListNode premNode = head;
            ListNode mNode = head.next;
            ListNode nNode = mNode, postnNode = mNode.next;
            for (int i = m; i < n; i++) {
                if (postnNode == null) {
                    return null;
                }
                ListNode temp = postnNode.next;
                postnNode.next = nNode;
                nNode = postnNode;
                postnNode = temp;
            }
            mNode.next = postnNode;
            premNode.next = nNode;
            
            return dummy.next;
        }
    }
    

    Python:

    class Solution:
        def reverse(self, head):
            prev = None
            while head != None:
                next = head.next
                head.next = prev
                prev = head
                head = next
            return prev
    
        def findkth(self, head, k):
            for i in xrange(k):
                if head is None:
                    return None
                head = head.next
            return head
    
        def reverseBetween(self, head, m, n):
            dummy = ListNode(-1, head)
            mth_prev = self.findkth(dummy, m - 1)
            mth = mth_prev.next
            nth = self.findkth(dummy, n)
            nth_next = nth.next
            nth.next = None
    
            self.reverse(mth)
            mth_prev.next = nth
            mth.next = nth_next
            return dummy.next
    

    Python:

    class Solution:
        def reverseBetween(self, head, m, n):
            dummyNode = ListNode(0)
            p = dummyNode
            q = head
    
            for x in range(m - 1):
                p.next = q
                q = q.next
                p = p.next
    
            start = None
            end = q
            next = None
            for x in range(m, n + 1):
                next = q.next
                q.next = start
                start = q
                q = next
    
            p.next = start
            end.next = next
            return dummyNode.next
    

    C++:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* reverseBetween(ListNode* head, int m, int n) {
            ListNode dummy{0};
            dummy.next = head;
    
            auto *prev = &dummy;
    
            for (int i = 0; i < m - 1; ++i) {
                prev = prev->next;
            }
    
            auto *head2 = prev;
    
            prev = prev->next;
            auto *cur = prev->next;
    
            for (int i = m; i < n; ++i) {
                prev->next = cur->next;  // Remove cur from the list.
                cur->next = head2->next; // Add cur to the head.
                head2->next = cur;       // Add cur to the head.
                cur = prev->next;        // Get next cur.
            }
    
            return dummy.next;
        }
    };
    

      

      

    类似题目:

    [LeetCode] 206. Reverse Linked List 反向链表

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    区分服务器和客户端,玩家的控制权
    分割字符串
    switch语句的使用
    博客暂停使用
    [题解]洛谷P1041 传染病控制
    [题解]洛谷P2668 斗地主
    [题解]洛谷P4017 最大食物链计数
    [题解]洛谷P1983 车站分级
    [OI学习笔记]倍增LCA
    [OI学习笔记]st表
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8507129.html
Copyright © 2020-2023  润新知