📌  相关文章
📜  用于反转单链表中的备用 K 节点的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:11:15.937000             🧑  作者: Mango

用于反转单链表中的备用 K 节点的 C++ 程序

本文介绍如何使用 C++ 编写代码,反转单链表中的备用 K 节点。以下是具体实现:

实现思路

使用三指针遍历链表,依次更改节点指向。步骤如下:

  1. 找到第 K 个节点的前置节点;
  2. 将前置节点连接到第 K+1 个节点;
  3. 将第 K 个节点连接到第 K+2 个节点;
  4. 重复步骤 2-3,直到反转完成。
代码实现
#include <iostream>

using namespace std;

// 定义单链表节点
struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode* reverseK(ListNode* head, int k) {
        if (head == NULL || k < 2) {
            return head;
        }

        ListNode* pre = NULL; // 前置节点
        ListNode* cur = head; // 当前节点
        ListNode* next = NULL; // 下一个节点
        ListNode* begin = NULL; // 从第 K 个节点开始反转
        int count = 1;

        while (cur != NULL) {
            next = cur->next;

            // 第 K 个节点的前置节点
            if (count == k) {
                begin = pre == NULL ? head : pre->next;
                head = pre == NULL ? cur : head;
            }

            // 反转节点
            if (count >= k) {
                cur->next = pre;
            }

            pre = cur;
            cur = next;
            count++;

            // 反转完成
            if (count == k + 1) {
                if (pre == NULL) {
                    head = begin;
                }
                else {
                    pre = begin;
                }

                begin->next = cur;
                begin = NULL;
                count = 1;
            }
        }

        return head;
    }
};

int main() {
    Solution s;
    ListNode* head = new ListNode(1);
    head->next = new ListNode(2);
    head->next->next = new ListNode(3);
    head->next->next->next = new ListNode(4);
    head->next->next->next->next = new ListNode(5);

    int k = 3;
    head = s.reverseK(head, k);

    while (head != NULL) {
        cout << head->val << " ";
        head = head->next;
    }
    cout << endl;

    return 0;
}
总结

本文介绍了使用 C++ 编写反转单链表中备用 K 节点的程序。通过遍历链表,依次更改节点指向。本文提供的代码仅供参考,读者可以根据自己的实际情况对代码进行修改和扩展。