交换链表中的节点-24-25

  • 两两交换链表中的节点-24

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

给定 1->2->3->4, 你应该返回 2->1->4->3.

 1 public class T24 {
 2 
 3     public ListNode swapPairs(ListNode head) {
 4         if (head == null) {
 5             return head;
 6         }
 7         ListNode dummy = new ListNode(-1);
 8         dummy.next = head;
 9         ListNode pre = dummy;
10 
11 
12         while (head != null && head.next != null) {
13 
14             ListNode p1 = head;
15             ListNode p2 = head.next;
16 
17             //exchange
18             pre.next = p2;
19             p1.next = p2.next;
20             p2.next = p1;
21 
22             //continue
23             pre = p1;
24             head = pre.next;
25 
26         }
27         return dummy.next;
28 
29     }
30 }
  •  k个一组反转链表-25

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

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

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

示例:

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

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

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

说明:

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

 1 public class T25 {
 2     public ListNode reverseKGroup(ListNode head, int k) {
 3         ListNode dummy = new ListNode(-1);
 4         dummy.next = head;
 5         ListNode pre = dummy;
 6         ListNode end = dummy;
 7 
 8         while (end.next != null) {
 9             for (int i = 0; i < k && end != null; i++) {
10                 end = end.next;
11             }
12             if (end == null) {
13                 break;
14             }
15             //复制出 start 和 next,即将被覆盖
16             ListNode start = pre.next;
17             ListNode next = end.next;
18             end.next = null;
19 
20             //反转 + 前驱节点拼接  start地址不变,但是其next指针更换为null
21             pre.next = reverse(start);
22             //end + 后驱节点
23             start.next = next;
24 
25             //更新pre和end
26             pre = start;
27             end = pre;
28 
29         }
30         return dummy.next;
31     }
32 
33     private ListNode reverse(ListNode start) {
34         ListNode dummy = new ListNode(-1);
35         while (start != null) {
36             ListNode next = start.next;
37             start.next = dummy.next;
38             dummy.next = start;
39             start = next;
40         }
41         return dummy.next;
42     }
43 }
一回生,二回熟
原文地址:https://www.cnblogs.com/zzytxl/p/12507999.html