以组为单位反转链表
以组为单位翻转单向链表
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; } }