一、链表的基本操作
(1) 遍历(统计链表长度)
(2) 查找链表中某元素
(3) 在链表中插入某节点
a. 链表头插入
b. 链表尾插入
c.给定节点之后插入
(4) 在链表中删除某结点
a. 删除给定结点之后的结点
b. 删除给定结点(并返回删除后的链表的头结点)
二、代码实现
class MyList{
public:
class Node{
public:
Node(int data){
this->value = data;
this->next = nullptr;
}
Node(int data, Node* next){
this->value = data;
this->next = next;
}
public:
int value;
Node* next;
};
// 遍历链表
int travel(Node* head){
Node* p = head;
while(p){
cout << p->value << endl;
p = p->next;
++this->count;
}
return this->count;
}
// 查找链表中某元素
Node* find(int value){
Node* p = dummyHead->next;
while(p){
if(p->value == value){
return p;
}
p = p->next;
}
return nullptr;
}
// 在链表中插入某节点
/// 链表头插入
void insertAtHead(int value){
Node* newnode = new Node(value);
newnode->next = dummyHead->next;
dummyHead->next = newnode;
while(!tail->next){ // 在插入多个头结点后,tail指针需要及时更新
tail = tail->next;
}
}
/// 给定节点之后插入
void insertAfter(Node* p, int value){
if(!p)
return;
Node* newnode = new Node(value);
newnode->next = p->next;
p->next = newnode;
while(!tail->next){
tail = tail->next;
}
}
// 在链表删除某节点
/// 删除给定节点之后的节点
void deleteNextNode(Node* p){
if(!p || !p->next){
return;
}
p->next = p->next->next;
}
/// 删除给定节点(并返回删除后的链表的头结点)
Node* deleteThisNode(Node* p){
if(!p || !dummyHead->next)
return nullptr;
Node* prev = dummyHead;
Node* q = dummyHead->next;
while(q){
if(q == p)
break;
prev = q;
q = q->next;
}
if(!q)
return dummyHead->next;
prev->next = prev->next->next;
return dummyHead->next;
}
public:
int nSize = 0;
Node* dummyHead = new Node(0);
Node* tail = dummyHead;
};
测试例子
int main() {
MyList A;
MyList::Node* p1 = new MyList::Node(1, nullptr);
MyList::Node* p2 = new MyList::Node(2, nullptr);
MyList::Node* p3 = new MyList::Node(3, nullptr);
MyList::Node* p4 = new MyList::Node(4, nullptr);
MyList::Node p5(9, nullptr);
A.insertAtHead(7);
A.insertAtTail(8);
A.insertAtHead(9);
A.insertAfter(A.vhead->next,10);
A.insertAfter(A.tail, 20);
A.insertAtTail(30);
A.travel(A.vhead->next);
cout << "------------------" << endl;
p3 = A.find(20);
p4 = A.find(7);
A.deleteNextNode(A.vhead->next);
//A.travel(A.vhead->next);
//cout << "******************" << endl;
A.deleteThisNode(A.vhead->next);
A.travel(A.vhead->next);
return 0;
}