以组为单位反转链表

以组为单位翻转单向链表

https://www.nowcoder.com/questionTerminal/c194388af737470d89514bd2b4cb4233

  1. 先定义a:该部分的头节点,b:该部分的尾节点的next节点(不在该部分中)
  2. 通过自己封装的reverse()完成反转,并返回新的头节点。即ListNode newHead = reverse(a,b);
  3. 而为了连接各个部分,我们可以利用递归的返回值,因为每个部分的头节点必定会成为尾节点,直接将本层递归的头节点的next置为下一层递归的返回值。即a.next = reverseLinkedList(b,n);
  4. 结束该层递归,返回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
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务