文档阅读
文档阅读I
文档阅读II
模板
按照顺序拼接node,并可以递归处理
//翻转从[a,b)之间的元素
private ListNode reverse(ListNode a, ListNode b){
ListNode pre = null, next = null;
while(a != b){
next = a.next;
a.next = pre;
pre = a;
a = next;
}
return pre;
}
题目
206. 反转链表
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null, next = null;
while(head != null){
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}
92. 反转链表 II
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode dumpy = new ListNode(-999);
dumpy.next = head;
ListNode help = dumpy;
for(int i = 0; i < left - 1; i++){
help = help.next;
}
ListNode leftNode = help;
help = help.next;
ListNode startNode = help;//要翻转的头节点
for(int i = left; i <= right; i++){
help = help.next;
}
ListNode rightNode = help;
ListNode newHead = reverse(startNode, rightNode);
//拼接成新的
leftNode.next = newHead;
startNode.next = rightNode;
return dumpy.next;
}
//翻转从[a,b)之间的元素
public ListNode reverse(ListNode head, ListNode tail) {
ListNode pre = null, next = null;
while(head != tail){
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}
25. K 个一组翻转链表
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(head == null) return null;
ListNode a = head, b = a;
for(int i = 0; i < k; i++){
if(b == null) return head;
b = b.next;
}
ListNode newHead = reverse(a, b);
a.next = reverseKGroup(b, k);
return newHead;
}
//翻转从[a,b)之间的元素
private ListNode reverse(ListNode a, ListNode b){
ListNode pre = null, next = null;
while(a != b){
next = a.next;
a.next = pre;
pre = a;
a = next;
}
return pre;
}
}