K个节点的组内逆序调整

这篇博客介绍了如何实现链表中每K个节点的逆序操作。通过两个辅助子方法,一个用于获取从给定节点开始的第K个节点,另一个用于反转指定范围内的链表节点,主方法能够将链表按K个节点为一组进行内部逆序。当链表长度不足以形成K个节点的组时,保持原有顺序。示例展示了K=3时的链表调整过程。

给定一个单链表的头节点head,和一个正数k

实现k个节点的小组内部逆序,如果最后一组不够k个就不调整例子:

调整前∶1 ->2-> 3-> 4 ->5-> 6->7 ->8, k = 3

调整后∶3-> 2 ->1-> 6->5-> 4 ->7 -> 8

先准备两个子方法;

子方法1:获取从当前节点开始的第K个节点; 若不足K个,返回null。

	public static Node getKGroupEnd (Node start, int k) {
        while (--k != 0 ) {
            if (start == null) {
                return start;
            }
            start = start.next;
        }
        return start;
    }

子方法2:给定一个头结点和尾节点,对二者及其中间节点反转;

例: 1 ->2-> 3-> 4

若传入(1,3),则返回 3->2->1->4

	public static void reverse (Node start, Node end) {
        end = end.next;
        Node pre = end;
        Node next = null;
        while (start != end) {
            next = start.next;
            start.next = pre;
            pre = start;
            start = next;
        }
    }

主方法:

获取头结点;

满足K个时,每K个一组逆序;

若不满足K个,直接返回头结点;

	public static Node reverseKGroupList (Node head, int K) {
        Node start = head;
        Node end = getKGroupEnd(start,K);
        if (end == null) {
            return head;
        }
        //获取头节点
        head = end;
        reverse(start,end);
        Node lastEnd = start;
        while (lastEnd.next != null) {
            start = lastEnd.next;
            end = getKGroupEnd(start,K);
            //若不满足K个,返回头结点
            if (end == null) {
                return head;
            }
            //K个一组逆序
            reverse(start,end);
            lastEnd.next = end;
            lastEnd = start;
        }
        return head;
    }

测试:1 ->2-> 3-> 4 ->5-> 6 , K=2

调整前:
1 2 3 4 5 6 
调整后:
2 1 4 3 6 5 

### Java实现单链表每K个节点逆序(尾部分) 以下是一个Java函数,用于将单链表从尾部分并每K个节点逆序,头部剩余不足一的保持原顺序。代码逻辑基于提供的参考引用[^1]和[^2],同时进行了适当的调整以满足需求。 ```java public class LinkedListReverse { public static class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } } /** * 将链表从尾部分,每K个节点逆序,头部剩余不足一的保持原顺序。 * @param head 链表的头结点 * @param k 反转节点的个数 * @return 返回新的头结点 */ public static Node reverseKGroupFromTail(Node head, int k) { if (head == null || head.next == null || k <= 1) { return head; } // 计算链表总长度 int length = getLength(head); // 计算需要反转的数 int groupCount = length / k; // 找到不需要反转的部分的结束位置 Node current = head; for (int i = 0; i < length - groupCount * k - 1; i++) { if (current == null) { break; } current = current.next; } // 如果没有需要反转的部分,直接返回 if (current == null || current.next == null) { return head; } // 分离出需要反转的部分 Node tailHead = current.next; current.next = null; // 对分离出的部分进行每K个节点的反转 Node newTailHead = reverseKNodes(tailHead, k); // 连接两部分 current.next = newTailHead; return head; } /** * 获取链表的长度 * @param head 链表的头结点 * @return 链表的长度 */ private static int getLength(Node head) { int length = 0; Node current = head; while (current != null) { length++; current = current.next; } return length; } /** * 每K个节点进行反转 * @param head 链表的头结点 * @param k 反转节点的个数 * @return 返回新的头结点 */ private static Node reverseKNodes(Node head, int k) { if (head == null || head.next == null) { return head; } Node curNode = head; for (int i = 1; curNode != null && i < k; i++) { curNode = curNode.next; } if (curNode == null) { return head; } Node temp = curNode.next; curNode.next = null; Node newHead = reverse(head); Node newTemp = reverseKNodes(temp, k); Node tempNode = newHead; for (int i = 1; i < k; i++) { tempNode = tempNode.next; } tempNode.next = newTemp; return newHead; } /** * 反转链表 * @param head 链表的头结点 * @return 返回反转后链表的头结点 */ private static Node reverse(Node head) { if (head == null || head.next == null) { return head; } Node newNode = reverse(head.next); head.next.next = head; head.next = null; return newNode; } /** * 打印链表 * @param head 链表的头结点 */ public static void printList(Node head) { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); } public static void main(String[] args) { Node head = new Node(1); head.next = new Node(2); head.next.next = new Node(3); head.next.next.next = new Node(4); head.next.next.next.next = new Node(5); head.next.next.next.next.next = new Node(6); head.next.next.next.next.next.next = new Node(7); System.out.print("Original List: "); printList(head); int k = 3; Node newHead = reverseKGroupFromTail(head, k); System.out.print("Reversed List (K=" + k + "): "); printList(newHead); } } ``` 上述代码实现了单链表的尾部分每K个节点逆序的功能,头部剩余不足一的部分保持原顺序。具体逻辑包括计算链表长度、分离需要反转的部分、对分离部分进行递归反转,并最终连接两部分。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

superzheng__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值