LeetCode 92. Reverse Linked List II 反转链表II(Java)

题目:

Reverse a linked list from position m to n. Do it in one-pass.

Note: 1 ≤ m ≤ n ≤ length of list.

Example:
Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL

解答:

一开始的思路是重新创建一个链表,遍历原链表的同时插入新链表,需要反转的部分则反向插入即可。但这样需要消耗额外的空间,所以改为采用在原链表上进行反转。

具体思路为:

  1. 创建虚拟结点 prehead,指向头结点,并创建 node 结点用来遍历链表
  2. 遍历链表,至 node 指向需要反转的第一个结点的前一个结点
  3. 创建结点 cur 指向 node.next,cur即原链表中需要反转的第一个结点
  4. 接着遍历链表需要反转的部分,将当前反转的结点即为 temp,将当前节点 temp 插入到 node.next
  5. 返回 prehead.next 即可
class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        if(head==null || head.next == null) {
            return head;
        }
        ListNode prehead = new ListNode(0);
        prehead.next = head;
        ListNode node = prehead;
        //将node移至需要反转的前一个节点
        for(int i=1; i<m; i++) {
            node = node.next;
        }
        //cur为需要反转的第一个节点,在接下来的遍历中所指向的节点保持不变
        ListNode cur = node.next;
        for(int i=m; i<n; i++) {
            ListNode temp = cur.next;   //当前需要反转的节点
            cur.next = temp.next;
            temp.next = node.next;
            node.next = temp;
        } 
        return prehead.next;
    }
}

你可能感兴趣的:(LeetCode)