标签: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 }
标签:stl out move 技术 节点 插入 blog add 清空
原文地址:http://www.cnblogs.com/DLL137578736/p/7624234.html