(链表)03-链表中的节点每K个一组反转

 1 import java.util.*;
 2 
 3 /*
 4  * public class ListNode {
 5  *   int val;
 6  *   ListNode next = null;
 7  * }
 8  */
 9 
10 public class Solution {
11     /**
12      *
13      * @param head ListNode类
14      * @param k int整型
15      * @return ListNode类
16      */
17     public ListNode reverseKGroup (ListNode head, int k) {
18         // 统计链表长度length
19         int length = 0;
20         ListNode current = head;
21         while(current != null) {
22             length = length + 1;
23             current = current.next;
24         }
25         // 校验特殊场景
26         if (k > length) {
27             return head;
28         }
29         // 初始最终链表的头节点
30         ListNode root = head;
31         // 分length/k次执行局部链表翻转
32         for (int i = 1; i <= length / k; i ++) {
33             root = reverseBetween(root, 1 + k * (i - 1), k * i);
34         }
35         // 返回结果
36         return root;
37     }
38 
39     public ListNode reverseBetween (ListNode head, int m, int n) {
40         // 添加表头
41         ListNode root = new ListNode(-1);
42         root.next = head;
43         // 局部链表的开始节点
44         ListNode begin = root;
45         // 局部链表的结束节点
46         ListNode end = root;
47         // 局部链表左边的节点
48         ListNode left = null;
49         // 局部链表右边的节点
50         ListNode right = null;
51         // 依次寻找局部链表的四个节点
52         for (int i = 0; i < m; i ++) {
53             left  = begin;
54             begin = begin.next;
55         }
56         for (int i = 0; i < n; i ++) {
57             end = end.next;
58             right = end.next;
59         }
60         // 断开连接
61         left.next = null;
62         end.next = null;
63         // 反转局部链表
64         reverseList(begin);
65         // 连接反转后的链表
66         left.next = end;
67         begin.next = right;
68         // 返回结果
69         return root.next;
70     }
71 
72     public ListNode reverseList(ListNode head) {
73         // 申请临时变量
74         ListNode current = head;
75         ListNode pre = null;
76         // 依次调换指针的方向
77         while (current != null) {
78             // 记录下个要处理的节点
79             ListNode next = current.next;
80             // 调换当前节点的指针方向
81             current.next = pre;
82             // 移动到下个要处理的节点
83             pre = current;
84             current = next;
85         }
86         // 返回调换后的头节点
87         return pre;
88     }
89 }

 

posted @ 2023-11-13 22:52  StringBuilder  阅读(25)  评论(0)    收藏  举报