LeetCode: Reverse Linked List
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.
地址:https://oj.leetcode.com/problems/reverse-linked-list-ii/
算法:先找到第m个节点p以及其前趋pre,然后把p记下,因为p是逆置链表部分的最后一个节点。然后从p开始遍历到第n个节点,并把节点依次插入pre后面,注意处理pre为空,也就是m=1的情况。代码:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *reverseBetween(ListNode *head, int m, int n) { 12 if(!head) return NULL; 13 ListNode *pre = NULL; 14 ListNode *p = head; 15 int i = 1; 16 while(p && i != m){ 17 pre = p; 18 p = p->next; 19 ++i; 20 } 21 if(!p) return head; 22 ListNode *first_reverse_node = p; 23 if(pre){ 24 pre->next = NULL; 25 } 26 ListNode *q = p; 27 while(q && i <= n){ 28 q = p->next; 29 if(pre){ 30 p->next = pre->next; 31 pre->next = p; 32 }else{ 33 if(p == head) 34 head->next = NULL; 35 else{ 36 p->next = head; 37 head = p; 38 } 39 } 40 p = q; 41 ++i; 42 } 43 first_reverse_node->next = q; 44 return head; 45 } 46 };
时间: 2024-10-07 05:06:34