35. 翻转链表
翻转一个链表
样例 1:
输入: 1->2->3->null 输出: 3->2->1->null
样例 2:
输入: 1->2->3->4->null 输出: 4->3->2->1->null
挑战
在原地一次翻转完成
/**
* Definition of singly-linked-list:
*
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
ListNode * reverse(ListNode * head) {
// write your code here
ListNode *pre=NULL;
while(head!=NULL)
{
ListNode *temp=head->next;
head->next=pre;
pre=head;
head=temp;
}
return pre;
}
};
36. 翻转链表 II
翻转链表中第m个节点到第n个节点的部分
例1:
输入: 1->2->3->4->5->NULL, m = 2 and n = 4, 输出: 1->4->3->2->5->NULL.
例2:
输入: 1->2->3->4->NULL, m = 2 and n = 3, 输出: 1->3->2->4->NULL.
挑战
Reverse it in-place and in one-pass
注意事项
m,n满足1 ≤ m ≤ n ≤ 链表长度
class Solution {
public:
void reverse(ListNode *head) {
ListNode *prev = NULL;
while (head != NULL) {
ListNode *temp = head->next;
head->next = prev;
prev = head;
head = temp;
}
}
ListNode *findkth(ListNode *head, int k) {
for (int i = 0; i < k; i++) {
if (head == NULL) {
return NULL;
}
head = head->next;
}
return head;
}
ListNode *reverseBetween(ListNode *head, int m, int n) {
ListNode *dummy = new ListNode(-1, head);
ListNode *mth_prev = findkth(dummy, m - 1);
ListNode *mth = mth_prev->next;
ListNode *nth = findkth(dummy, n);
ListNode *nth_next = nth->next;
nth->next = NULL;
reverse(mth);
mth_prev->next = nth;
mth->next = nth_next;
return dummy->next;
}
};