zoukankan      html  css  js  c++  java
  • [LeetCode] 25. K 个一组翻转链表 ☆☆☆☆☆(链表)

    https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/javadi-gui-fang-fa-100-by-chadriy-imdgvs6udp/

    https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/tu-jie-kge-yi-zu-fan-zhuan-lian-biao-by-user7208t/

    描述

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

    k 是一个正整数,它的值小于或等于链表的长度。

    如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

    示例 :

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

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

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

    说明 :

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

    解析

    遍历出k个节点,然后翻转子链表,再接到原链表上。

    代码

    //my
    public
    ListNode reverseKGroup(ListNode head, int k) { if (head == null || k <= 1) return head; int temp = k; ListNode p = head; while (temp > 1) { if (p == null) break; p = p.next; temp--; } if (p == null) return head; ListNode cur_pre = head; ListNode next_pre = p.next; p.next = null; ListNode newHead = reverse(cur_pre);//此时cur_pre.next = null,即cur_pre为新子链表的最后一个节点 p = cur_pre; head = newHead; p.next = reverseKGroup(next_pre, k); return head; } public ListNode reverse(ListNode head) { if (head == null) { return head; } ListNode pre = null; ListNode cur = head; while (cur != null) { ListNode next = cur.next; cur.next = pre; pre = cur; cur = next; } return pre; }
    //注意2个节点的翻转链表即可
    public ListNode reverseKGroup(ListNode head, int k) {
            if (k <= 0) return head;
            int temp = k;
            ListNode p = head;
            while (temp > 1) {
                if (p == null) break;
                p = p.next;
                temp--;
            }
            if (p == null) return head;
            ListNode cur_pre = head;
            ListNode pNext_pre = p.next;
            ListNode newHead = reverseList(head, p);
            head = newHead;
            p = cur_pre;
            p.next = reverseKGroup(pNext_pre, k);
            return head;
        }
    
        public ListNode reverseList(ListNode head, ListNode endNode) {
            ListNode pre = null;
            ListNode cur = head;
            ListNode end = endNode.next;
            while (cur != end) {
                ListNode next = cur.next;
                cur.next = pre;
                pre = cur;
                cur = next;
            }
            return pre;
        }
  • 相关阅读:
    在过滤器中验证接口中的Token
    导出EXCEL的 两个方法
    调用webservice接口,返回xml(String)转义
    时间类的操作
    jvm 内存解析以及jvm调优
    redis springMVC 配置与应用
    题目2 成绩排序
    题目1 排序
    题目1042:Coincidence
    题目1131:合唱队形
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/11843396.html
Copyright © 2011-2022 走看看