以组为单位反转链表
以组为单位翻转单向链表
https://www.nowcoder.com/questionTerminal/c194388af737470d89514bd2b4cb4233
- 先定义a:该部分的头节点,b:该部分的尾节点的next节点(不在该部分中)
- 通过自己封装的reverse()完成反转,并返回新的头节点。即ListNode newHead = reverse(a,b);
- 而为了连接各个部分,我们可以利用递归的返回值,因为每个部分的头节点必定会成为尾节点,直接将本层递归的头节点的next置为下一层递归的返回值。即a.next = reverseLinkedList(b,n);
- 结束该层递归,返回newHead。
public class Solution {
/**
* reverse the given linked list
* @param head ListNode类 the head of the linked list
* @param n int整型 the N
* @return ListNode类
*/
public ListNode reverseLinkedList (ListNode head, int n) {
if(head == null) return null;
ListNode a = head;
ListNode b = head;
for(int i = 0; i < n; i++){
if(b == null) break;
b = b.next;
}
ListNode newHead = reverse(a,b);
a.next = reverseLinkedList(b,n);
return newHead;
}
// 头插法:利用dummyHead进行简化
public ListNode reverse(ListNode a, ListNode b){
ListNode dummyHead = new ListNode(-1);
ListNode cur = a;
ListNode next = cur.next;
dummyHead.next = cur;
while(next!=b){
cur.next = next.next;
next.next = dummyHead.next;
dummyHead.next = next;
next = cur.next;
}
return dummyHead.next;
}
}
查看2道真题和解析