描述
给你一个链表,每 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; }