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.
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]: def reverse(a,b): if a == b: return a pre = None cur = a while cur!=b: c_next = cur.next cur.next = pre pre = cur cur = c_next return pre fake = ListNode(-1,head) a = fake for i in range(left-1): a = a.next b = head for i in range(right-1): b = b.next b_next = b.next a.next = reverse(a.next,b.next) cur = fake while cur and cur.next: cur = cur.next cur.next = b_next return fake.next
1 class Solution { 2 public: 3 ListNode* reverseList(ListNode* head) { 4 if(head == nullptr || head->next == nullptr) return head; 5 ListNode* pre = nullptr; 6 ListNode* cur = head; 7 while(cur != nullptr) { 8 ListNode* c_next = cur->next; 9 cur->next = pre; 10 pre = cur; 11 cur = c_next; 12 } 13 return pre; 14 } 15 ListNode* reverseBetween(ListNode* head, int left, int right) { 16 if(head == nullptr || head->next == nullptr) return head; 17 ListNode* fakehead = new ListNode(0); 18 fakehead->next = head; 19 20 ListNode* pre = fakehead; 21 ListNode* cur = head; 22 ListNode* right_node = head; 23 24 //遍历找到左节点 pre 跟右节点 25 int cnt = 1; 26 while(cur!=nullptr) { 27 if(cnt==left-1) { 28 pre = cur; 29 } 30 if (cnt == right) { 31 right_node = cur; 32 } 33 cur = cur->next; 34 cnt++; 35 } 36 37 ListNode* left_node = pre->next; 38 ListNode* c_next = right_node->next; 39 right_node->next = nullptr; 40 pre->next = reverseList(left_node); 41 left_node->next = c_next; 42 return fakehead->next; 43 } 44 };
1 class Solution { 2 public ListNode reverseBetween(ListNode head, int m, int n) { 3 if(head == null) return head; 4 ListNode fakehead = new ListNode(0); 5 fakehead.next = head; 6 ListNode pre = fakehead; 7 8 9 for (int i = 0; i < m-1;i++) pre = pre.next; 10 11 ListNode start = pre.next; 12 ListNode then = start.next; 13 14 for(int i = 0 ;i < n -m ;i++){ 15 start.next= then.next; 16 then.next = pre.next; 17 pre.next = then; 18 then=start.next; 19 } 20 return fakehead.next; 21 } 22 }