📌  相关文章
📜  在双向链表中从头开始与第 K 个节点交换第 K 个节点(1)

📅  最后修改于: 2023-12-03 14:51:24.739000             🧑  作者: Mango

在双向链表中从头开始与第 K 个节点交换第 K 个节点

双向链表是一种自我指向数据结构,每个节点都有指向前一个和后一个节点的指针。在双向链表中,可以非常方便地在任意两个节点之间进行插入和删除操作,而不必像单向链表那样从头开始逐个遍历。

当需要在双向链表中交换两个节点时,需要考虑以下几个方面:

  1. 交换节点的前驱和后继指针。
  2. 更新原来相邻节点的前驱或后继指针。

下面给出一个简单的示例代码,以交换双向链表中的第 K 个节点为例:

// 定义双向链表节点结构体
struct ListNode {
    int val;
    ListNode* prev;
    ListNode* next;
    ListNode(int x) : val(x), prev(NULL), next(NULL) {}
};

ListNode* swapNode(ListNode* head, int k) {
    if (head == NULL || head->next == NULL || k < 1) return head;
    ListNode* p = head;
    while (p != NULL && --k) p = p->next;
    if (p == NULL) return head;
    ListNode* q = p->next;
    if (q == NULL) return head;
    p->next = q->next;
    q->prev = p->prev;
    if (p == head) {
        head = q;
    } else {
        p->prev->next = q;
    }
    if (q->next != NULL) {
        q->next->prev = p;
    }
    p->prev = q;
    q->next = p;
    return head;
}
  1. 首先定义了一个双向链表节点的结构体 ListNode。
  2. 然后定义了一个 swapNode 函数,其中 head 表示双向链表的头结点,而 k 表示要交换的节点的位置。
  3. 在函数中,首先进行一些边界判断,如果 head 为空或 head 的下一个节点为空或者 k 不合法,直接返回 head。
  4. 然后定义两个指针 p 和 q,分别指向要交换的两个节点。其中 p 指向第 K 个节点,q 指向第 K+1 个节点。
  5. 然后分别交换节点的前驱和后继指针,并更新原来相邻节点的前驱或后继指针。
  6. 最后返回新的头结点 head。

这个示例代码仅供参考,实际情况下需要根据具体的问题进行更改。