📜  从双向链表中删除相邻的重复节点(1)

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

从双向链表中删除相邻的重复节点

双向链表是一种常用的数据结构,在某些情况下可能会出现相邻的重复节点,需要将其删除。本文将介绍如何在C++中实现这个操作。

算法实现

我们可以通过遍历链表,比较相邻节点的值,将重复的节点删除。具体步骤如下:

  1. 如果链表为空或只有一个节点,则直接返回。
  2. 定义两个指针p和q,分别指向第一个节点和第二个节点。
  3. 遍历链表:
    1. 如果p节点和q节点的值相等,则将q节点删除,并将p节点指向下一个节点。
    2. 如果p节点和q节点的值不相等,则将p节点和q节点都指向下一个节点。
  4. 返回头节点。

C++代码实现如下:

struct ListNode {
    int val;
    ListNode* next;
    ListNode* prev;
    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}
};

ListNode* deleteDuplicates(ListNode* head) {
    if (!head || !head->next) {  // 链表为空或只有一个节点
        return head;
    }
    ListNode* p = head;
    ListNode* q = head->next;
    while (q) {
        if (p->val == q->val) {  // 删除重复节点
            p->next = q->next;
            if (q->next) {
                q->next->prev = p;
            }
            ListNode* tmp = q;
            q = q->next;
            delete tmp;
        } else {  // 继续遍历
            p = q;
            q = q->next;
        }
    }
    return head;
}
测试样例

下面是一些测试样例,供您参考:

样例1:

输入:

1 <-> 2 <-> 2 <-> 3

输出:

1 <-> 3
样例2:

输入:

1 <-> 1 <-> 2 <-> 3 <-> 3

输出:

2
样例3:

输入:

1 <-> 1

输出:

空链表
总结

本文介绍了如何在C++中实现从双向链表中删除相邻的重复节点。这是一种常用的数据结构操作,可以帮助程序员更加高效地处理链表。希望本文对您有所帮助!