對(duì)C++鏈表進(jìn)行解讀分析
C++語(yǔ)言是學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的很好的學(xué)習(xí)工具,能夠全面的理解了C++中C++鏈表的作用和用途,那么對(duì)于理解其C++描述,Java描述都就輕而易舉了,以后學(xué)習(xí)什么語(yǔ)言都不會(huì)覺(jué)得難了。
單鏈表的交換節(jié)點(diǎn)的含義是:給定一個(gè)單鏈表,要求交換其中的任意兩個(gè)節(jié)點(diǎn)。注意這里鏈表的頭節(jié)點(diǎn)是不參與節(jié)點(diǎn)交換的。這個(gè)看上去是比較簡(jiǎn)單,但是實(shí)現(xiàn)起來(lái)卻還是需要一定的基本功。
對(duì)于這個(gè)問(wèn)題,關(guān)鍵是要用4個(gè)指針來(lái)保存兩個(gè)交換的節(jié)點(diǎn)的前后節(jié)點(diǎn)位置,具體實(shí)現(xiàn)請(qǐng)參見(jiàn)實(shí)現(xiàn)源碼。實(shí)際上,還有一個(gè)邏輯更加清晰的實(shí)現(xiàn):只要用兩個(gè)指針保存當(dāng)前的兩個(gè)交換節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)。#t#
然后依次刪除待交換節(jié)點(diǎn),再在記錄的前一個(gè)節(jié)點(diǎn)后交替插入刪除的兩個(gè)節(jié)點(diǎn),也就是實(shí)際上將這個(gè)過(guò)程轉(zhuǎn)化為了對(duì)于C++鏈表的兩個(gè)基本操作就可以完成了。但是要注意的是,這個(gè)實(shí)現(xiàn)中當(dāng)兩個(gè)交換節(jié)點(diǎn)是相鄰節(jié)點(diǎn)的時(shí)候會(huì)出現(xiàn)問(wèn)題,要單獨(dú)處理,具體原因手工操作一次即可得知。后一種方法這里就不給出了。
實(shí)現(xiàn)代碼中要說(shuō)明的是,交換C++鏈表節(jié)點(diǎn)傳入的是兩個(gè)交換節(jié)點(diǎn)指針,但是為了測(cè)試簡(jiǎn)單實(shí)現(xiàn),將這兩個(gè)節(jié)點(diǎn)換成了待交換節(jié)點(diǎn)的關(guān)鍵字(值域),再到C++鏈表中定位。
具體實(shí)現(xiàn)源碼為:
- //Link.h
- #include <iostream>
- #include <ctime>
- struct Node
- {
- public:
- Node():_val(0),_next(NULL)
- {
- }
- Node(int val):_val(val),_next(NULL)
- {
- }
- Node(int val,Node* next):_val(val),_next(next)
- {
- }
- ~Node()
- {
- if (_next)
- delete _next;
- }
- public:
- int _val;
- Node* _next;
- };
- typedef Node* LinkNode;
- Node* CreateLink(int len,int MAX_BOUND = 100)
- {
- srand((unsigned int)time(NULL));
- LinkNode head = new Node(-1);
- LinkNode tmp = head;
- for (int i = 0; i < len; ++i)
- {
- //tmptmp = tmp->_next = new Node(rand() % MAX_BOUND);
- tmptmp = tmp->_next = new Node(i);
- }
- tmp->_next = NULL;
- return head;
- }
- void ExchLinkNode (const LinkNode head,int i1,int i2)
- {
- //head不準(zhǔn)被交換
- LinkNode prenode1 = NULL; //保存待交換節(jié)點(diǎn)node1的前一個(gè)節(jié)點(diǎn)
- LinkNode postnode1 = NULL; //保存待交換節(jié)點(diǎn)node1的后一個(gè)節(jié)點(diǎn)
- LinkNode prenode2 = NULL; //保存待交換節(jié)點(diǎn)node2的前一個(gè)節(jié)點(diǎn)
- LinkNode postnode2 = NULL; //保存待交換節(jié)點(diǎn)node2的后一個(gè)節(jié)點(diǎn)
- LinkNode node1 = NULL; //保存待交換的節(jié)點(diǎn)
- LinkNode node2 = NULL; //保存待交換的節(jié)點(diǎn)
- LinkNode tmp = head;
- //定位兩個(gè)節(jié)點(diǎn)
- while ((tmp->_val != i1) && (tmp != NULL))
- {
- tmptmp = tmp->_next;
- }
- if (tmp == NULL)
- {
- return ;
- }
- else
- {
- node1 = tmp;
- }
- tmp = head;
- while ((tmp->_val != i2) && (tmp != NULL))
- {
- tmptmp = tmp->_next;
- }
- if (tmp == NULL)
- {
- return ;
- }
- else
- {
- node2 = tmp;
- }
- //不得和頭節(jié)點(diǎn)交換
- if (node1 == head)
- {
- return ;
- }
- else if (node2 == head)
- {
- return ;
- }
- //自己和自己就不必交換了
- if (node1 == node2)
- {
- return ;
- }
- tmp = head;
- while (tmp->_next != node1)
- {
- tmptmp = tmp->_next;
- }
- prenode1 = tmp;
- tmp = head;
- while (tmp->_next != node2)
- {
- tmptmp = tmp->_next;
- }