1. 程式人生 > >Reverse Linked List II -- LeetCode

Reverse Linked List II -- LeetCode

                原題連結: http://oj.leetcode.com/problems/reverse-linked-list-ii/
這道題是比較常見的連結串列反轉操作,不過不是反轉整個連結串列,而是從m到n的一部分。分為兩個步驟,第一步是找到m結點所在位置,第二步就是進行反轉直到n結點。反轉的方法就是每讀到一個結點,把它插入到m結點前面位置,然後m結點接到讀到結點的下一個。總共只需要一次掃描,所以時間是O(n),只需要幾個輔助指標,空間是O(1)。程式碼如下: 
public ListNode reverseBetween(ListNode head, int m, int n) {    if(head == null
)        return null;    ListNode dummy = new ListNode(0);    dummy.next = head;    ListNode preNode = dummy;    int i=1;    while(preNode.next!=null && i<m)    {        preNode = preNode.next;        i++;    }    if(i<m)        return head;    ListNode mNode = preNode.next;    ListNode cur = mNode.next;    while
(cur!=null && i<n)    {        ListNode next = cur.next;        cur.next = preNode.next;        preNode.next = cur;        mNode.next = next;        cur = next;        i++;    }    return dummy.next;}
上面的程式碼還是有些細節的,連結串列的題目就是這樣,想起來道理很簡單,實現中可能會出些小差錯,還是熟能生巧哈。