Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
You may not alter the values in the nodes, only nodes itself may be changed.
Only constant memory is allowed.
For example,
Given this linked list:
Given this linked list:
1->2->3->4->5
For k = 2, you should return:
2->1->4->3->5
For k = 3, you should return:
3->2->1->4->5
先统计目前节点的数量,达到k就把当前k个结点翻转。遍历linkedlist 当到达k的时候翻转,所以总体来说每个结点会被访问两次。总时间复杂度是O(2*n)=O(n),空间复杂度是O(1)。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode reverseKGroup(ListNode head, int k) { if (k == 0 || k == 1) { return head; } ListNode dummy = new ListNode(0); dummy.next = head; int count = 0; ListNode pre = dummy; ListNode cur = head; while (cur != null) { count++; cur = cur.next; if (count == k) { pre = reverse(pre,cur);//pre 变成翻转链表后的最后一个node, 此处翻转pre和cur中间的点 count = 0; } } return dummy.next; } public ListNode reverse(ListNode pre, ListNode next) { ListNode last = pre.next; ListNode cur = pre.next.next; while (cur != next) { last.next = cur.next; cur.next = pre.next; pre.next = cur; cur = last.next; } return last; } }
没有评论:
发表评论