• [LeetCode] 25. k个一组翻转链表


    题目链接: https://leetcode-cn.com/problems/reverse-nodes-in-k-group/

    题目描述:

    给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。

    k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。

    示例:

    示例 :

    给定这个链表:1->2->3->4->5

    k = 2 时,应当返回: 2->1->4->3->5

    k = 3 时,应当返回: 3->2->1->4->5

    说明 :

    • 你的算法只能使用常数的额外空间。
    • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

    思路:

    思路一:

    用栈,我们把k个数压入栈中,然后弹出来的顺序就是翻转的!

    这里要注意几个问题

    第一,剩下的链表个数够不够k个(因为不够k个不用翻转);

    第二,已经翻转的部分要与剩下链表连接起来

    思路二:

    尾插法

    直接举个例子: k = 3

    pre
    tail    head
    dummy    1     2     3     4     5
    # 我们用tail 移到要翻转的部分最后一个元素
    pre     head       tail
    dummy    1     2     3     4     5
    		cur
    # 我们尾插法的意思就是,依次把cur移到tail后面
    pre          tail  head
    dummy    2     3    1     4     5
    		cur
    # 依次类推
    pre     tail      head
    dummy    3     2    1     4     5
    		cur
    ....
    

    思路3:

    递归

    关注我的知乎专栏,了解更多解题技巧!我们一起进步.

    代码:

    思路1:

    python

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
            dummy = ListNode(0)
            p = dummy
            while True:
                count = k 
                stack = []
                tmp = head
                while count and tmp:
                    stack.append(tmp)
                    tmp = tmp.next
                    count -= 1
                # 注意,目前tmp所在k+1位置
                # 说明剩下的链表不够k个,跳出循环
                if count : 
                    p.next = head
                    break
                # 翻转操作
                while stack:
                    p.next = stack.pop()
                    p = p.next
                #与剩下链表连接起来 
                p.next = tmp
                head = tmp
            
            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 reverseKGroup(ListNode head, int k) {
            Deque<ListNode> stack = new ArrayDeque<ListNode>();
            ListNode dummy = new ListNode(0);
            ListNode p = dummy;
            while (true) {
                int count = 0;
                ListNode tmp = head;
                while (tmp != null && count < k) {
                    stack.add(tmp);
                    tmp = tmp.next;
                    count++;
                }
                if (count != k) {
                    p.next = head;
                    break;
                }
                while (!stack.isEmpty()){
                    p.next = stack.pollLast();
                    p = p.next;
                }
                p.next = tmp;
                head = tmp;
            }
            return dummy.next;
        }
    }
    

    思路2:

    尾插法

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
            dummy = ListNode(0)
            dummy.next = head
            pre = dummy
            tail = dummy
            while True:
                count = k
                while count and tail:
                    count -= 1
                    tail = tail.next
                if not tail: break
                head = pre.next
                while pre.next != tail:
                    cur = pre.next # 获取下一个元素
                    # pre与cur.next连接起来,此时cur(孤单)掉了出来
                    pre.next = cur.next 
                    cur.next = tail.next # 和剩余的链表连接起来
                    tail.next = cur #插在tail后面
                # 改变 pre tail 的值
                pre = head 
                tail = head
            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 reverseKGroup(ListNode head, int k) {
            ListNode dummy = new ListNode(0);
            dummy.next = head;
            ListNode pre = dummy;
            ListNode tail = dummy;
            while (true) {
                int count = 0;
                while (tail != null && count != k) {
                    count++;
                    tail = tail.next;
                }
                if (tail == null) break;
                ListNode head1 = pre.next;
                while (pre.next != tail) {
                    ListNode cur = pre.next;
                    pre.next = cur.next;
                    cur.next = tail.next;
                    tail.next = cur;
                }
                pre = head1;
                tail = head1;
            }
            return dummy.next;
        }
    }
    

    思路3:

    递归

    python

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
            cur = head
            count = 0
            while cur and count!= k:
                cur = cur.next
                count += 1
            if count == k:
                cur = self.reverseKGroup(cur, k)
                while count:
                    tmp = head.next
                    head.next = cur
                    cur = head
                    head = tmp
                    count -= 1
                head = cur   
            return head
    

    java

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode reverseKGroup(ListNode head, int k) {
            ListNode cur = head;
            int count = 0;
            while (cur != null && count != k) {
                cur = cur.next;
                count++;
            }
            if (count == k) {
                cur = reverseKGroup(cur, k);
                while (count != 0) {
                    count--;
                    ListNode tmp = head.next;
                    head.next = cur;
                    cur = head;
                    head = tmp;
                }
                head = cur;
            }
            return head;
        }
    
    
  • 相关阅读:
    烂泥:KVM虚拟机windows系统增加硬盘
    烂泥:KVM虚拟机克隆
    烂泥:KVM快照的创建与恢复
    烂泥:【解决】word复制windows live writer没有图片
    烂泥:ubuntu中使用virt-manager图形化新建虚拟机
    烂泥:ubuntu安装KVM虚拟机管理virt-manager
    烂泥:【解决】ubuntu使用远程NFS报错
    烂泥:kvm安装windows系统蓝屏
    烂泥:ubuntu安装vmtools
    烂泥: KVM虚拟机Linux系统增加硬盘
  • 原文地址:https://www.cnblogs.com/powercai/p/10791730.html
Copyright © 2020-2023  润新知