您的位置:首页 > 其它

LeetCode --- 92. Reverse Linked List II

2015-04-09 10:50 387 查看
题目链接:Reverse Linked List II
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->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
这道题的要求是将链表中m到n位置反转。
链表处理,先加一个空表头,便于处理。然后令l指针移动到m位置前面,令r移动到m位置,这样不断把r后面的节点插入到l后面,直到n位置。

[code]假设m=2,n=4,链表为:
head -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL

加头之后为:
h -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL

令l指针移动到m位置前面,令r移动到m位置,即:
h -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL
          ^    ^
          |    |
          l    r

r后面的节点插入到l后面:
ListNode *temp = l -> next:
h -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL
          ^    ^
          |    |
          l  temp、r 

l -> next = r -> next:
          |-------->|
h -> 0 -> 1    2 -> 3 -> 4 -> 5 -> NULL
          ^    ^
          |    |
          l  temp、r

r -> next = r -> next -> next:
          |-------->|
h -> 0 -> 1    2    3 -> 4 -> 5 -> NULL
          ^    |-------->|
          |    ^
          l    |
             temp、r

l -> next -> next = temp:
          |-------->|
h -> 0 -> 1    2 <- 3    4 -> 5 -> NULL
          ^    |-------->|
          |    ^
          l    |
             temp、r

即:
h -> 0 -> 1 -> 3 -> 2 -> 4 -> 5 -> NULL
          ^         ^
          |         |
          l         r

进而继续把r后面节点插入到l后面,以此类推,进行循环。。。


时间复杂度:O(n)
空间复杂度:O(1)

[code] 1 class Solution
 2 {
 3 public:
 4     ListNode *reverseBetween(ListNode *head, int m, int n)
 5     {
 6         ListNode *h = new ListNode(0);
 7         h -> next = head;
 8         
 9         ListNode *l = h, *r;
10         for(int i = 1; i < m; ++ i)
11             l = l -> next;
12         
13         r = l -> next;
14         for(int i = 1; i < n - m + 1; ++ i)
15         {
16             ListNode *temp = l -> next;
17             l -> next = r -> next;
18             r -> next = r -> next -> next;
19             l -> next -> next = temp;
20         }
21         
22         return h -> next;
23     }
24 };


转载请说明出处:LeetCode --- 92. Reverse Linked List II
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: