Advertisement
greannmhar

список

Nov 25th, 2024
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct ListNode {
  5.     int value;
  6.     ListNode* next;
  7. };
  8.  
  9. ListNode* Process(ListNode* head, unsigned k) {
  10.     // Указатели для прохода по списку
  11.     ListNode* fast = head;
  12.     ListNode* slow = head;
  13.     ListNode* prev = nullptr;
  14.  
  15.     // Сдвигаем указатель fast на k шагов вперед
  16.     for (unsigned i = 0; i < k; ++i) {
  17.         if (fast == nullptr) return head; // Если список короче k, ничего не делаем
  18.         fast = fast->next;
  19.     }
  20.  
  21.     // Продвигаем fast до конца списка, одновременно двигая slow
  22.     while (fast != nullptr) {
  23.         fast = fast->next;
  24.         prev = slow;
  25.         slow = slow->next;
  26.     }
  27.  
  28.     // Удаляем slow (k-ый элемент с конца)
  29.     if (prev == nullptr) {
  30.         // Если удаляемый элемент — это head
  31.         head = head->next;
  32.     } else {
  33.         prev->next = slow->next;
  34.     }
  35.     delete slow;
  36.  
  37.     return head;
  38. }
  39.  
  40. // Вспомогательная функция для создания нового узла
  41. ListNode* CreateNode(int value) {
  42.     ListNode* newNode = new ListNode;
  43.     newNode->value = value;
  44.     newNode->next = nullptr;
  45.     return newNode;
  46. }
  47.  
  48. // Вспомогательная функция для печати списка
  49. void PrintList(ListNode* head) {
  50.     while (head) {
  51.         cout << head->value << " ";
  52.         head = head->next;
  53.     }
  54.     cout << endl;
  55. }
  56.  
  57. // Вспомогательная функция для удаления списка
  58. void DeleteList(ListNode* head) {
  59.     while (head) {
  60.         ListNode* temp = head;
  61.         head = head->next;
  62.         delete temp;
  63.     }
  64. }
  65.  
  66. int main() {
  67.     // Создаем список
  68.     ListNode* head = nullptr;
  69.     ListNode* tail = nullptr;
  70.     int n, k;
  71.  
  72.     cout << "enter list length: ";
  73.     cin >> n;
  74.     if (n <= 0){
  75.         cout << "incorrect value for n!";
  76.         return -1;
  77.     }
  78.     cout << "enter list elements: ";
  79.     for (int i = 0; i < n; ++i) {
  80.         int value;
  81.         cin >> value;
  82.         ListNode* newNode = CreateNode(value);
  83.         if (head == nullptr) {
  84.             head = newNode;
  85.             tail = newNode;
  86.         } else {
  87.             tail->next = newNode;
  88.             tail = newNode;
  89.         }
  90.     }
  91.  
  92.     cout << "enter k: ";
  93.     cin >> k;
  94.     if (k < 0 || k > n){
  95.         cout << "incorrect value for k!";
  96.         return -1;
  97.     }
  98.     head = Process(head, k);
  99.  
  100.     cout << "result list: ";
  101.     PrintList(head);
  102.  
  103.     DeleteList(head);
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement