循环双链表删除结点,删除值为num的所有结点
关于遍历循环双向链表删除特定结点的问题,我一直没在网上看到能成功的在我的编辑器上运行的代码,于是自己写了一个,逻辑比较啰嗦,但能成功运行,我把几个边界点单独拿出来讨论的。
下面是代码
#include <iostream>
using namespace std;
class linknode {
public:
int data;
linknode* next, * prev;
linknode(int info = 0, linknode* nextpr = NULL, linknode* prevpr = NULL)
{
data = info;
next = nextpr;
prev = prevpr;
}
};
class linklist {
public:
linknode* head, * tail;
linklist()
{
head = tail = NULL;
}
void push(int num)
{
if (head == NULL) {
head = tail = new linknode(num);
head->next = NULL;
tail->next = head;
}
else {
linknode* p = new linknode(num);
tail->next = p;
p->prev = tail;
tail = p;
tail->next = head;
}
}
void deletelinknode(int num)
{
linknode* p = this->head;
linknode* q = p->next;
for (; p->next != head; p = q)
{
q = q->next;
if (p->data == num)
{
if (p == head)
{
head = p->next;
p->next->prev = tail;
tail->next = p->next;
delete p;
}
else
{
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
}
}
}
if (p == tail)
{
if (p->data == num)
{
tail = p->prev;
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
}
}
}
void display()
{
if (head == tail) {
return; //说明没有元素,直接返回即可
}
for (linknode* p = head;; p = p->next) {
if (p == tail) {
cout << tail->data << endl;
break;
}
cout << p->data << " ";
}
}
};
int main()
{
linklist ll;
int count, value;
cin >> count;
for (int i = 0; i < count; i++) {
cin >> value;
ll.push(value);
}
cout << "初始值为:";
ll.display();
cin >> value;
ll.deletelinknode(value);
cout << "删除值为" << value << "的结点后为:";
ll.display();
return 0;
}
欢迎交流和指正