Reverse Linked List II

来源:互联网 发布:js清空div内容 编辑:程序博客网 时间:2024/05/16 08:07

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

For example:
Given 1->2->3->4->5->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

思路: We set 2 pointers to count the m and n . If we find the m, then we get a pre pointer before m. Then we cut the list off and insert the rest nodes to the pre.next by using a tail insertion. When we find the mth node and get the m.next, we need to find the tail of the front list and the tail.next node is m.next.

易错点: 1. 注意找到m 之后, pre.next = null 来断开list. 
2. 注意尾插的时候, nextNode 要先走到下一位 再 插入。
3. 最后末尾别忘记把两个list 合成一个。
/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public ListNode reverseBetween(ListNode head, int m, int n) {        ListNode newHead = new ListNode(0);        ListNode pre = newHead;        ListNode nextNode = head;        newHead.next = head;        int count = 1;        while(count < m ){// 找到第一个 m            count++;            pre = pre.next;            nextNode = nextNode.next;        }        pre.next = null;        while(count <= n ){// 每次尾插一个节点, 即为逆序            ListNode cur = nextNode;            nextNode = nextNode.next;            cur.next = pre.next;            pre.next = cur;            count++;        }        ListNode cur = pre;        while(cur.next != null){// 找到前半部分List  的 末尾            cur = cur.next;        }        cur.next = nextNode;// 连接起来        return newHead.next;    }}


0 0
原创粉丝点击