- 两两交换链表中的节点-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 }