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;
}
};