码迷,mamicode.com
首页 > 编程语言 > 详细

C++数据结构之传统单链表

时间:2017-10-03 19:00:23      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:stl   out   move   技术   节点   插入   blog   add   清空   

  这几天有空重写一下数据结构,从单链表开始吧,这个是C++版本的,后面会根据情况是否补充上C版本的。

这个文章写了之后,也查看了网络上其他的数据结构写法,发现大家的写法多多少少都有一些不一样的地方,而

我的写法也和大家多多少少有一些不一样的地方,欢迎大家参阅,如果有问题请帮忙指正,我会尽力修改,希望

大家能够一起进步!谢谢!

LinkList.h头文件

 1 #pragma once
 2 #include<iostream>
 3 using namespace std;
 4 
 5 class LinkNode
 6 {
 7 public:
 8     int data;
 9     LinkNode* next;
10 };
11 
12 class LinkList
13 {
14 public:
15     LinkList();
16 
17     //插入操作
18     void InsertLinkNodeByPox(int pox, int val);
19 
20     //根据值删除元素
21     void RemoveLinkNodeByVal(int val);
22 
23     //根据位置删除元素
24     void RemoveLinkNodeByPox(int pox);
25 
26     //反转链表  方法1 这个是我第一时候写的,方法比表原始,本来准备删除的,不过毕竟是心血,还是放上面把。。。。。。  较笨拙,不推荐。。
27     void reverse();
28 
29     //反转链表  方法1  这个简单  非递归方法
30     void reverseSimply();  //方法简单!
31 
32     //递归实现链表反转
33     LinkNode* reserveByRecursion(LinkNode* hd);
34 
35     //遍历链表
36     void ForEachLinkList();
37 
38     //根据值查找节点的位置
39     LinkNode* FindVal(int val);
40 
41     //返回长度
42     int LinkListLength();
43 
44 
45     //清空链表
46     void clearList();
47 
48     //析构函数
49     ~LinkList();
50     
51 public:
52     LinkNode* head;
53 
54     int length;
55 };

 

LinkList.cpp实现文件

技术分享
  1 #include "LinkList.h"
  2 
  3 LinkList::LinkList()
  4 {
  5     this->length = 0;
  6     this->head = new LinkNode;
  7     head->data = -1;
  8     head->next = NULL;
  9 }
 10 
 11 void LinkList::InsertLinkNodeByPox(int pox, int val)
 12 {
 13     if (pox < 0 || pox > this->length)
 14     {
 15         pox = this->length;
 16     }
 17     
 18     LinkNode* pcurNode = this->head;
 19 
 20     //找到插入位置的前一个节点
 21     for (int i = 0; i < pox; ++i)
 22     {
 23         pcurNode = pcurNode->next;
 24     }
 25     LinkNode* newNode = new LinkNode;
 26     newNode->data = val;
 27     newNode->next = pcurNode->next;
 28     pcurNode->next = newNode;
 29 
 30     this->length++;
 31 }
 32 
 33 void LinkList::RemoveLinkNodeByVal(int val)
 34 {
 35     if (this->length <= 0)
 36     {
 37         return;
 38     }
 39     LinkNode* pcurNode = this->head;
 40     LinkNode* preNode = this->head;
 41     
 42     for (int i = 0; i < this->length; ++i)
 43     {
 44         pcurNode = pcurNode->next;
 45         if (pcurNode->data == val)
 46         {
 47             preNode->next = pcurNode->next;
 48             delete pcurNode;
 49             pcurNode = NULL;
 50             this->length--;
 51             return;
 52         }
 53         preNode = pcurNode;
 54     }
 55 
 56 }
 57 
 58 void LinkList::RemoveLinkNodeByPox(int pox)
 59 {
 60     if (pox < 0 || pox >= this->length)
 61     {
 62         return;
 63     }
 64     LinkNode* pcurNode = this->head;
 65 
 66     //找到前去节点
 67     for (int i = 0; i < pox; ++i)
 68     {
 69         pcurNode = pcurNode->next;
 70     }
 71 
 72     LinkNode* delNode = pcurNode->next;
 73     pcurNode->next = delNode->next;
 74     delete delNode;
 75     delNode = NULL;
 76 
 77     this->length--;
 78 }
 79 
 80 void LinkList::reverse()
 81 {
 82     if (NULL == this->head->next)
 83     {
 84         return;
 85     }
 86     LinkNode* pFirst = this->head->next;  //指向头结点
 87 
 88     if (NULL == pFirst->next)
 89     {
 90         return;
 91     }
 92     LinkNode* pMid = this->head->next;    //指向头结点的下一个节点
 93 
 94     if (NULL == pMid->next)
 95     {
 96         pFirst->next = NULL;
 97         pMid->next = pFirst;
 98         this->head->next = pMid;
 99         return;
100     }
101 
102     LinkNode* pLast = pMid->next;
103     pFirst->next = NULL;
104     while (true)
105     {
106         pMid->next = pFirst;  //让第二个节点指向第一个节点
107         pFirst = pLast->next;  //让第一个节点挪动到最后一个节点的下一个
108         
109         if (NULL == pFirst)
110         {
111             pLast->next = pMid;
112             head->next = pLast;
113             return;
114         }
115 
116         pLast->next = pMid;
117         pMid = pFirst->next;
118 
119         if (NULL == pMid)
120         {
121             pFirst->next = pLast;
122             head->next = pFirst;
123             return;
124         }
125 
126         pFirst->next = pLast;
127         pLast = pMid->next;
128         if (NULL == pLast)
129         {
130             pMid->next = pFirst;
131             head->next = pMid;
132             return;
133         }
134     }
135 }
136 
137 void LinkList::reverseSimply()
138 {
139     LinkNode* pnext = this->head->next;  //记载下一个节点,也是反转后的第一个节点
140 
141     LinkNode* pcur = NULL;  //记载当前的
142     LinkNode* ppre = NULL;    //记载前一个节点
143 
144     while (true)
145     {
146         if (NULL == pnext->next && NULL == pnext->next)  //如果只有头节点或者只有一个节点,或者pnext到了最后一个节点
147         {
148             this->head->next = pnext;
149             pnext->next = pcur;             //防止最后一个节点没有链接上倒数第二个
150             return;
151         }
152         pcur = pnext;
153         pnext = pnext->next;  //上一步已经完成占位操作,之后让自己下移,记载下一个节点指针
154         pcur->next = ppre;  //经过上面两步,当前节点已经下移了一位,让自己的下一个指向之前的一个节点
155         ppre = pcur;    //上一步已经完成反向链接过程,让ppre后移一个节点
156     }
157 
158 }
159 
160 
161 LinkNode * LinkList::reserveByRecursion(LinkNode* hd)
162 {
163     if (NULL == hd->next)  //递归先找到最后一个节点
164     {
165         this->head->next = hd;
166         return hd;
167     }
168     LinkNode* pcurNode = reserveByRecursion(hd->next);  //是反转前的最后一个节点,反转后的第一个节点
169 
170     pcurNode->next = hd;
171 
172     return hd;
173 }
174 
175 
176 void LinkList::ForEachLinkList()
177 {
178     LinkNode* pcurNode = this->head;
179 
180     for (int i = 0; i < this->length; ++i)
181     {
182         pcurNode = pcurNode->next;
183         cout << pcurNode->data << "   ";
184     }
185     cout << endl;
186 }
187 
188 LinkNode* LinkList::FindVal(int val)
189 {
190     if (this->length <= 0)
191     {
192         return NULL;
193     }
194 
195     LinkNode* pcurNode = head;
196     for (int i = 0; i < this->length; ++i)
197     {
198         pcurNode = pcurNode->next;
199         if (pcurNode->data == val)
200         {
201             cout << "找到了!" << endl;
202             return pcurNode;
203         }
204     }
205     return NULL;
206 }
207 
208 int LinkList::LinkListLength()
209 {
210     return this->length;
211 }
212 
213 
214 
215 void LinkList::clearList()
216 {
217     if (this->length <= 0)
218     {
219         return;
220     }
221     
222     LinkNode* pcurNode = head;
223     LinkNode* pnextNode = head->next;
224 
225     for (int i = 0; i < length; ++i)
226     {
227         pcurNode = pnextNode;
228         pnextNode = pcurNode->next;
229         if (pcurNode != NULL)
230         {
231             delete pcurNode;
232             pcurNode = NULL;
233         }
234     }
235 
236     this->length = NULL;
237 }
238 
239 LinkList::~LinkList()
240 {
241     if (this->length <= 0)
242     {
243         if (NULL != head)
244         {
245             delete head;
246             head = NULL;
247         }
248         return;
249     }
250 
251     LinkNode* pcurNode = head;
252     LinkNode* pnextNode = head->next;
253 
254     for (int i = 0; i < length; ++i)
255     {
256         pcurNode = pnextNode;
257         pnextNode = pcurNode->next;
258         if (pcurNode != NULL)
259         {
260             delete pcurNode;
261             pcurNode = NULL;
262         }
263     }
264     this->length = 0;
265     if (NULL != head)
266     {
267         delete head;
268         head = NULL;
269     }
270     return;
271 }
View Code

 

C++数据结构之传统单链表

标签:stl   out   move   技术   节点   插入   blog   add   清空   

原文地址:http://www.cnblogs.com/DLL137578736/p/7624234.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!