链表(一)

Posted flyingfishesss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表(一)相关的知识,希望对你有一定的参考价值。

单链表

单链表有两个部分,一个是数据域,用来储存相应的数据;另一个是指针域,用来储存下一个结点的位置。由于单链表的结点的物理位置是不连续的,因此能够提高存储空间的利用率,同时有利于插入和删除的操作。

技术图片

1、定义结点

1 class  Node{
2     public:
3         int  data;
4         Node  *next;
5 };

2、定义单链表的操作

 1 class  LinkList{
 2     public:
 3         LinkList();
 4         ~LinkList();
 5         void  h_Insert();                   //头插法
 6         void  r_Insert();                    //尾插法
 7         void  Insert( int  mes, int index );  //在指定位置插入元素
 8         void  Delete( int index );             //删除指定位置元素
 9         void  show();
10                 
11     private:
12         Node  *head;                          //头指针
13         Node  *rear;                          //尾指针
14         int  length;                
15 };

 

3、初始化单链表

初始化单链表的头尾指针,以及链表的长度

1 head = new Node;
2 if( head == NULL ){
3     cout << "Failed to creat a list." << endl;
4     exit(-1);
5 }
6 head->next = NULL;
7 rear = head;
8 length = 0;

 

4、创建单链表 -- 头插法

技术图片

注意:这样输出的元素的顺序与输入元素的顺序相反

 1 void  LinkList :: h_Insert()
 2 {
 3         int  data;
 4         while( cin>>data ){
 5                 Node  *node  =  new  Node;
 6                 if( node == NULL ){
 7                         cout << "Failed to head insert a node." << endl;
 8                         exit(-1);
 9                 }
10                 node->data = data;
11                 node->next = head->next;
12                 head ->next = node;
13                 
14                 length++;
15         }
16         cout << "Success to head insert." <<endl;
17 }

 

5、创建单链表 -- 尾插法

技术图片

注意:这样输出的元素的顺序与输入元素的顺序相同

 1 void  LinkList :: r_Insert()
 2 {
 3         int  data;
 4         while( cin>>data ){
 5                 Node  *node  =  new  Node;
 6                 if( node == NULL ){
 7                         cout << "Failed to rear insert a node." << endl;
 8                         exit(-1);
 9                 }
10                 node->data = data;
11                 node->next = NULL;
12                 rear->next = node;
13                 rear = node;
14                 
15                 length++;
16         }
17 
18         cout << "Success to rear insert." <<endl;
19 }

 

6、插入元素

技术图片    

注意:插入元素的位置是否在链表合理的范围内

 1 void  LinkList :: Insert( int  mes, int index )
 2 {
 3         int  i = 0;
 4         Node  *p = head;
 5         Node  *node = new Node;
 6         node->data = mes;
 7         while( i < index-1 && p && index>0){
 8                 i++;
 9                 p = p->next;
10         }
11         if( !p || i > length || index<=0 ){
12                 cout << "Fail to insert " << mes << " in " << index <<" ."<<endl;
13                 exit(-1);
14         }
15         node->next = p->next;
16         p->next = node;
17         
18         length++;
19         
20         cout << "Success to insert a data." << endl;
21 }

 

7、删除元素

技术图片   

注意:删除元素的位置是否在链表合理的范围内

 1 void  LinkList :: Delete( int index )
 2 {
 3         int  i = 0;
 4         Node  *p = head;
 5         if( !p || index > length || index<=0 ){
 6                 cout << "Fail to delete in " << index <<" ."<<endl;
 7                 exit(-1);
 8         }
 9         while( i < index-1 && p && index>0){
10                 i++;
11                 p = p->next;
12         }
13         Node *q = p->next;
14         p->next = q->next;
15         delete q;
16         length--;
17         cout << "Success to delete a data." << endl;
18 }

以上是关于链表(一)的主要内容,如果未能解决你的问题,请参考以下文章

NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段

C语言反转单向链表的代码

VsCode 代码片段-提升研发效率

需要一种有效的方法来避免使用 Laravel 5 重复代码片段

创建自己的代码片段(CodeSnippet)

一些恶心的代码片段