您的位置:首页 > 其它

92. Reverse Linked List II 等题

2016-11-20 22:30 183 查看

206. Reverse Linked List

原题:

Reverse a singly linked list.

题解:

用递归很容易解决这个问题,几个问题,要先获取最后一个元素(未来的首元素),复杂度为O(n)。递归一遍,复杂度为O(2n)。总复杂度为O(n)。

代码:

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head) {
return head;
}
ListNode* h=head;
while(h->next) {
h = h->next;
}
helper(head);
return h;
}

ListNode* helper(ListNode* node) {
if(node->next == NULL) {
return node;
}
auto n = helper(node->next);
node->next = NULL;
n->next = node;
return node;
}
};


92. 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.

题解:

一个范围,两个要注意的点,变换范围的前面和后面元素。一开始用朴素的方法来实现,出现了很多奇怪的特殊情况,比如头元素为1之类的。于是去找了一下别人的实现方法,看到一个很巧妙的交换方法,目前也不是非常理解,先贴出来给共同学习。

代码:

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode *head, int m, int n) {
ListNode dummy(0), *prev = &dummy;
dummy.next = head;
for (int i=1; i<m; i++)
prev = prev->next;
ListNode *pivot = prev->next;
for (int i=m; i<n; i++) {
swap(prev->next, pivot->next->next);
swap(prev->next, pivot->next);
}
return dummy.next;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode