1. 题目描述:
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
Example:
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
Note:
- Only constant extra memory is allowed.
- You may not alter the values in the list’s nodes, only nodes itself may be changed.
2. 思路分析:
题目的意思是将一个链表按照顺序每k个进行翻转。
此题可以新建一个方法用于翻转含有k个节点的链表区间。然后在主方法中遍历整个列表,用一个计数器表示遍历的节点数,当达到k个时调用一下新建的那个方法对这k个节点进行翻转,然后将计数器清为0,继续遍历,以此类推。
3. Java代码:
源代码
:见我GiHub主页
代码:
public static ListNode reverseKGroup(ListNode head, int k) {
// 构建一个头结点,方便连接最后结果
ListNode dummy = new ListNode(-1);
dummy.next = head;
// 指向翻转区间第一个节点的前一个节点
ListNode pre = dummy;
// 指向翻转区间的第一个节点
ListNode first = pre.next;
// 用于遍历的当前节点指针
ListNode cur = first;
int cnt = 0;
while (cur != null) {
cnt++;
if (cnt == k) {
ListNode last = cur;
pre.next = reverseOneGroup(first, last);
// 注意此处的first节点已经是翻转后的最后一个节点了
pre = first;
first = pre.next;
cur = first;
cnt = 0;
} else {
cur = cur.next;
}
}
return dummy.next;
}
/**
* 用于翻转一个区间内的链表
*/
private static ListNode reverseOneGroup(ListNode first, ListNode last) {
while (first != last) {
ListNode cur = first;
first = first.next;
cur.next = last.next;
// last节点作为翻转后的第一个节点
last.next = cur;
}
return last;
}