zoukankan      html  css  js  c++  java
  • [LeetCode] 92. 反转链表 II

    题目链接 : https://leetcode-cn.com/problems/reverse-linked-list-ii/

    题目描述:

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

    说明:
    1 ≤ mn ≤ 链表长度。

    示例:

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

    思路:

    思路一:

    找到要翻转部分的链表,将其翻转,再与原链表拼接;

    直接看代码注释.

    思路二:

    用三个指针,进行插入操作

    例如:

    1->2->3->4->5->NULL, m = 2, n = 4

    将节点3插入节点1和节点2之间

    变成: 1->3->2->4->5->NULL

    再将节点4财力节点1和节点3之间

    变成:1->4->3->2->5->NULL

    实现翻转的效果!

    代码:

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
            dummy = ListNode(-1)
            dummy.next = head
            pre = dummy
            # 找到翻转链表部分的前一个节点, 1->2->3->4->5->NULL, m = 2, n = 4 指的是 节点值为1
            for _ in range(m-1):
                pre = pre.next
            # 用双指针,进行链表翻转
            node = None
            cur = pre.next
            for _ in range(n-m+1):
                tmp = cur.next
                cur.next = node
                node = cur
                cur = tmp
            # 将翻转部分 和 原链表拼接
            pre.next.next = cur
            pre.next = node
            return dummy.next
    

    java

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode reverseBetween(ListNode head, int m, int n) {
            ListNode dummy = new ListNode(-1);
            dummy.next = head;
            ListNode pre = dummy;
            // 找到翻转链表部分的前一个节点, 1->2->3->4->5->NULL, m = 2, n = 4 指的是 节点值为1
            for (int i = 0; i < m - 1; i++) pre = pre.next;
            // 用双指针,进行链表翻转
            ListNode node = null;
            ListNode cur = pre.next;
            for (int i = 0; i < n - m + 1; i++) {
                ListNode tmp = cur.next;
                cur.next = node;
                node = cur;
                cur = tmp;
            }
            // 将翻转部分 和 原链表拼接
            pre.next.next = cur;
            pre.next = node;
            return dummy.next;
            
        }
    }
    

    思路二:

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
            dummy = ListNode(-1)
            dummy.next = head
            pre = dummy
             # 找到翻转链表部分的前一个节点, 1->2->3->4->5->NULL, m = 2, n = 4 指的是 节点值为1
            for _ in range(m - 1):
                pre = pre.next
            # 用 pre, start, tail三指针实现插入操作
            # tail 是插入pre,与pre.next的节点
            start = pre.next
            tail = start.next
            for _ in range(n - m):
                start.next = tail.next
                tail.next = pre.next
                pre.next = tail
                tail = start.next
            return dummy.next
    

    java

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode reverseBetween(ListNode head, int m, int n) {
            ListNode dummy = new ListNode(-1);
            dummy.next = head;
            ListNode pre = dummy;
            // 找到翻转链表部分的前一个节点, 1->2->3->4->5->NULL, m = 2, n = 4 指的是 节点值为1
            for (int i = 0; i < m - 1; i++) pre = pre.next;
            // 用 pre, start, tail三指针实现插入操作
            // tail 是插入pre,与pre.next的节点
            ListNode start = pre.next;
            ListNode tail = start.next;
            for (int i = 0; i < n - m; i++) {
                start.next = tail.next;
                tail.next = pre.next;
                pre.next = tail;
                tail = start.next;
            }
            return dummy.next;
        }
    }
    
  • 相关阅读:
    多重背包POJ1276不要求恰好装满 poj1014多重背包恰好装满
    哈理工1053完全背包
    求最小公倍数与最大公约数的函数
    Bus Pass ZOJ 2913 BFS 最大中取最小的
    POJ 3624 charm bracelet 01背包 不要求装满
    HavelHakimi定理(判断一个序列是否可图)
    z0j1008Gnome Tetravex
    ZOJ 1136 Multiple BFS 取模 POJ 1465
    01背包 擎天柱 恰好装满 zjut(浙江工业大学OJ) 1355
    zoj 2412 水田灌溉,求连通分支个数
  • 原文地址:https://www.cnblogs.com/powercai/p/11036265.html
Copyright © 2011-2022 走看看