Reverse Linked List II -- LeetCode
阿新 • • 發佈:2018-12-22
原題連結: http://oj.leetcode.com/problems/reverse-linked-list-ii/
這道題是比較常見的連結串列反轉操作,不過不是反轉整個連結串列,而是從m到n的一部分。分為兩個步驟,第一步是找到m結點所在位置,第二步就是進行反轉直到n結點。反轉的方法就是每讀到一個結點,把它插入到m結點前面位置,然後m結點接到讀到結點的下一個。總共只需要一次掃描,所以時間是O(n),只需要幾個輔助指標,空間是O(1)。程式碼如下:
這道題是比較常見的連結串列反轉操作,不過不是反轉整個連結串列,而是從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;}
上面的程式碼還是有些細節的,連結串列的題目就是這樣,想起來道理很簡單,實現中可能會出些小差錯,還是熟能生巧哈。