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

Chương trình xoay danh sách liên kết k vị trí trong C++


Giả sử có một danh sách liên kết. Ta phải xoay danh sách sang phải k vị trí. Giá trị k sẽ là số dương. Vì vậy nếu danh sách như [1→2→3→4→5→NULL], và k = 2, thì đầu ra sẽ là [4→5→1→2→3→NULL].

Các bước như sau:

  • Nếu danh sách rỗng, trả về null
  • len := 1
  • Tạo nút tail := head
  • khi next của tail không null
    • tăng len 1
    • tail := next của tail
  • next của tail := head
  • k := k mod len
  • newHead := null
  • với i := 0 đến len - k
    • tail := next của tail
  • newHead := next của tail
  • next của tail := null
  • trả về newHead

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->next) {
        cout << ptr->val << ", ";
        ptr = ptr->next;
    }
    cout << "]" << endl;
}

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if(!head) return head;
        int len = 1;
        ListNode* tail = head;
        while(tail->next) {
            len++;
            tail = tail->next;
        }
        tail->next = head;
        k %= len;
        ListNode* newHead = NULL;
        for(int i = 0; i < len - k; i++) {
            tail = tail->next;
        }
        newHead = tail->next;
        tail->next = NULL;
        return newHead;
    }
};

int main() {
    Solution ob;
    vector<int> v = {1,2,3,4,5,6,7,8,9};
    ListNode *head = make_list(v);
    print_list(ob.rotateRight(head, 4));
    return 0;
}

Đầu vào

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

Đầu ra

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