Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Đảo ngược danh sách liên kết II trong C++

Giả sử chúng ta có một danh sách liên kết. Chúng ta phải đảo ngược các nút từ vị trí m đến n. Phải làm trong một lần duyệt. Ví dụ, danh sách [1,2,3,4,5] với m = 2 và n = 4, kết quả sẽ là [1,4,3,2,5].

Các bước thực hiện:

  • Sẽ có hai phương thức: reverseN() và reverseBetween(). reverseBetween() là phương thức chính.
  • Định nghĩa con trỏ nút liên kết gọi là successor là null
  • reverseN hoạt động như sau:
  • nếu n = 1, thì successor := next của head, và return head
  • last = reverseN(next của head, n - 1)
  • next của (next của head) = head, và next của head := successor, return last
  • reverseBetween() hoạt động như sau:
  • nếu m = 1, thì return reverseN(head, n)
  • next của head := reverseBetween(next của head, m – 1, n – 1)

Hãy xem triển khai sau để hiểu rõ hơn:

Ví dụ

#include <bits/stdc++.h> using namespace std; class ListNode{    public:       int val;       ListNode *next;       ListNode(int data){          val = data;          next = NULL;       }    };    ListNode *make_list(vector<int> v){       ListNode *head = new ListNode(v[0]);       for(int i = 1; i<v.size(); i++){          ListNode *ptr = head;          while(ptr->next != NULL){             ptr = ptr->next;          }          ptr->next = new ListNode(v[i]);       }       return head;    }    void print_list(ListNode *head){       ListNode *ptr = head;       cout << "[";       while(ptr){          cout << ptr->val << ", ";          ptr = ptr->next;       }       cout << "]" << endl;  }  class Solution {    public:       ListNode* successor = NULL;       ListNode* reverseN(ListNode* head, int n ){          if(n == 1){             successor = head->next;             return head;          }          ListNode* last = reverseN(head->next, n - 1);          head->next->next = head;          head->next = successor;          return last;       }       ListNode* reverseBetween(ListNode* head, int m, int n) {       if(m == 1){             return reverseN(head, n);       }       head->next = reverseBetween(head->next, m - 1, n - 1);             return head;    }  }; main(){    Solution ob;    vector<int> v = {1,2,3,4,5,6,7,8};    ListNode *head = make_list(v);    print_list(ob.reverseBetween(head, 2, 6)); }

Input

[1,2,3,4,5,6,7,8] 2 6

Output

[1, 6, 5, 4, 3, 2, 7, 8, ]