基础概念
1.什么是链表
- 链表是一种物理存储单元上非连续、非顺序的存储结构。
- 链表由一系列结点组成,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。当链表的每个结点只包含一个指针域时,此链表称为单链表。
2.链表的基本操作
-
新建头结点:
将节点的next置为NULL即可。
-
插入新的节点(以在head后插入为例)
新建一个新的节点p,使p的next的指向head->next所指向的地址,然后将head->next从新指向p
-
删除指定节点:
先遍历到指定节点的前一个节点,然后通过将前一个节点的next指针指向指定节点的下一个节点,达到悬空指定节点的效果,然后删除指定节点
-
修改指定节点:
遍历到指定节点的位置,将其data修改为要修改的值
- 链表反转
定义三个临时节点指向头结点之后的第1个节点p,第2个节点q和第3个节点m。将p->next置为空,然后将q->next = p,然后将p向后移动一个节点,即p = q,最后将q向后移动一个节点,即q = m,最后把m向后移动一个节点,即m = m->next;依此类推直到m等于NULL,然后将q->next = p,最后将head->next指向q
3.头指针、头结点、头元素
- 在单链表的第一个结点(有效元素)之前附设一个结点,称之为头结点;
- 指向头结点的指针,称之为头指针;
- 对于头结点,数据域可以不存储任何信息,也可存储如链表长度等附加信息
- 首元结点就是第一个元素的结点,它是头结点后边的第一个结点
- 对单链表的存取必须从头指针开始进行,由于单链表的最后一个数据元素没有直接后继,则指针为NULL。
头指针与头结点不同,头结点即第一个结点,头指针是指向第一个结点的指针。链表中可以没有头结点,但不能没有头指针。
代码实现
1.链表的创建、插入、删除、修改、反转
#include <iostream>
using namespace std;
struct Node{
int data;
Node *next;
//Node(int d):data(d),next(NULL){}
Node(int d){
data = d;
next = NULL;
}
};
class List{
public:
Node *head;
void create_List(){
head = new Node(0);
}
void insert(int d){
Node *p = new Node(d);
p->next = head->next;
head->next = p;
}
void print(){
for(Node *p=head->next; p; p=p->next){
cout<<p->data<<"-->";
}
}
Node* find(int d){
Node *p;
for(p=head;p;p=p->next){
if(p->next->data == d){break;}//这里需要注意返回的是目标节点的前一个节点,这样做是为了便于删除节点
}
return p;
}
void insert_pos(int d, int res){
Node *p = find(d);
p = p->next;//注意,之前的p不是目标节点,p->next才是
Node *q = new Node(res);
q->next = p->next;
p->next = q;
}
void delete_pos(int d){
Node* p = find(d);//注意
Node* q = p->next;
p->next = q->next;
delete q;
}
void update(int d, int res){
Node* p = find(d);//注意
p = p->next;
p->data = res;
}
//这个很重要!!
void reverse(){
Node* p = head->next;
Node* q = p->next;
Node* m = q->next;
p->next = NULL;
while(m){
q->next = p;
p = q;
q = m;
m = m->next;
}
q->next = p;
head->next = q;
}
};
int main() {
List list;
list.create_List();
list.insert(100);
list.insert(120);
list.insert(210);
list.insert(300);
list.insert(400);
list.insert(500);
list.insert(600);
cout<<".............create list.................."<<endl;
list.print();
cout<<endl<<"............insert node.................."<<endl;
list.insert_pos(210,800);
list.print();
cout<<endl<<".............delete node.................."<<endl;
list.delete_pos(800);
list.print();
cout<<endl<<".............update node..................."<<endl;
list.update(600,700);
list.print();
cout<<endl<<".............reverse list.................."<<endl;
list.reverse();
list.print();
return 0;
}
参考1:https://www.cnblogs.com/scand...
参考2:http://www.nowamagic.net/libr...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。