• 【刷题】NC50 链表中的节点每k个一组翻转


    借助栈。

    /**
     * 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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    尾插法

    思路分析:

    1、将链表分为三个部分,已翻转–待翻转–未翻转。

    2、定义start和end来指向待翻转部分的开头结点和末尾结点,并定义pre和next用来指向待翻转部分的前驱结点和后继结点。(由于头部没有前驱结点,所以定义一个哨兵节点dummy来作为头结点的前驱结点)。

    3、每k个一组进行一下循环:

    ①首先end指向前驱结点pre,循环往前移动k次,找到待翻转链表的最后一个节点。(其中有可能不足k个,就提前跳出循环,跳出循环后做个判断当前end是不是null,如果是说明不足k个,不需要进行以下翻转链表的操作);

    ②开始翻转链表,记录next=end.next保存后继结点,然后使end.next = null(即将待翻转部分先分隔开),start=pre.next

    ③写个翻转链表的方法reverse,传入的参数就是start,作为待翻转链表的头结点,并返回翻转后链表的头结点,并使pre.next=返回的头结点(这就处理了待翻转部分的前驱结点的连接)

    ④使start.next = next(这就处理了待翻转部分的后继结点的连接)

    4、上述便完成了一次k个一组链表的翻转,更新pre=start,end=pre开始下一次循环

    5、最后返回头节点dummy.next,因为定义的哨兵节点永远指向头结点。

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public ListNode reverseKGroup(ListNode head, int k) {
            ListNode dummy = new ListNode(0);
            dummy.next = head;
     
            ListNode pre = dummy;
            ListNode end = dummy;
            while(end.next != null){
                for(int i = 0;i < k && end != null;i++){
                    end = end.next;
                }
                if(end == null){
                    break;
                }
                ListNode next = end.next;
                ListNode start = pre.next;
                end.next = null;
                pre.next = reverse(start);
                start.next = next;
                pre = start;
                end = pre;
            }
            return dummy.next;
        }
     
        public ListNode reverse(ListNode head){
            ListNode pre = null;
            ListNode cur = head;
            while(cur != null){
                ListNode next = cur.next;
                cur.next = pre;
                pre = cur;
                cur = next;
            }
            return pre;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
  • 相关阅读:
    血清与血浆
    pdf 插件和node报错问题
    期末前端web大作业——HTML+CSS+JavaScript仿京东购物商城网页制作(7页)
    c语言练习:POJ 1003 宿醉(HangOver)
    Tomcat 源码解析一容器加载-大寂灭指(下)
    基于C++ DNN部署Yolov8出现的问题记录
    【flex布局】解决:使用justify-content排列,一行四个,最后一行少于四个时,排列不会与上面的对齐
    STM32G0开发笔记-Platformio+libopencm3-串口中断
    JS EventListener
    【Numpy】numpy.mean() 的用法
  • 原文地址:https://blog.csdn.net/yexiguafu/article/details/126498594