鍊錶是最為常見,並且經常需要使用到的資料結構之一。對於單鏈表的基本操作,例如建立鍊錶、插入、刪除等都不是特別複雜,但是其實對於鍊錶的操作實際上很多的操作還是有一定的難度,例如上次給出的單鏈表的逆轉,以及這裡的單鏈表交換兩個節點。
單鏈表的交換節點的含義是:給定乙個單鏈表,要求交換其中的任意兩個節點。注意這裡鍊錶的頭節點是不參與節點交換的。這個看上去是比較簡單,但是實現起來卻還是需要一定的基本功。
對於這個問題,關鍵是要用4個指標來儲存兩個交換的節點的前後節點位置,具體實現請參見實現原始碼。實際上,還有乙個邏輯更加清晰的實現:只要用兩個指標儲存當前的兩個交換節點的前乙個節點,然後依次刪除待交換節點,再在記錄的前乙個節點後交替插入刪除的兩個節點,也就是實際上將這個過程轉化為了對於鍊錶的兩個基本操作就可以完成了。但是要注意的是,這個實現中當兩個交換節點是相鄰節點的時候會出現問題,要單獨處理,具體原因手工操作一次即可得知。後一種方法這裡就不給出了。
實現**中要說明的是,交換鍊錶節點傳入的是兩個交換節點指標,但是為了測試簡單實現,將這兩個節點換成了待交換節點的關鍵字(值域),再到鍊錶中定位。
具體實現原始碼為:
#include
#include
struct node
node(int val):_val(val),_next(null)
node(int val,node* next):_val(val),_next(next)
~node()
public:
int _val;
node* _next;
};typedef node* linknode;
node* createlink(int len,int max_bound = 100)
tmp->_next = null;
return head;
}void exchlinknode (const linknode head,int i1,int i2)
if (tmp == null)
else
tmp = head;
while ((tmp->_val != i2) && (tmp != null))
if (tmp == null)
else
//不得和頭節點交換
if (node1 == head)
else if (node2 == head)
//自己和自己就不必交換了
if (node1 == node2)
tmp = head;
while (tmp->_next != node1)
prenode1 = tmp;
tmp = head;
while (tmp->_next != node2)
prenode2 = tmp;
postnode1 = node1->_next;
postnode2 = node2->_next;
//交換節點
prenode1->_next = node2;
node2->_next = postnode1;
prenode1->_next = node1;
node1->_next = postnode2;
}void print(linknode head,char* info)
cout測試程式為:
c語言雙鏈表排序交換節點 C語言學習 交換法排序
計算機領域,排序和查詢是兩種最基本的操作任務,幾乎在所有資料庫程式 程式設計程式和作業系統中都有應用。排序是把一系列資料按公升序或降序排列的過程,也就是將乙個無序大的資料序列調整為有序序列的過程,它往往占用很多cpu的執行時間。至今已經產生了許多比較成熟的排序演算法,如交換法 選擇法 插入排序法 冒...
c語言雙鏈表排序交換節點 雙向鍊錶排序C語言程式
雙向鍊錶排序.cpp 定義控制台應用程式的入口點。include include include define len sizeof struct node struct node int data struct node next struct node last struct list stru...
單鏈表操作(帶頭節點)
帶頭節點的單鏈表 include include typedef struct lnodenode linklist bool initlist linklist 初始化單鏈表 bool listinsert linklist int int 在指定位置插入資料 bool empty linklis...