單鏈表專題一

2021-06-21 06:08:03 字數 2818 閱讀 4030

單鏈表總結

typedef struct listnode

} listnode;

/* *@brief: 列印單鏈表

*/void printslist(const listnode *head)

cout << endl;}/*

*@brief:用給出的陣列以頭插法建立單鏈表

*/void createslist(listnode *&head, int a, int n)

}/* 1

*@brief:單鏈表逆序

*/void reverselist(listnode *&head)

}/* 2

*@brief: 在單鏈表中查詢倒數第k個元素

*/listnode* findkthfromend(listnode *head, int k)

if(count < k) return null; //注意點二

listnode *qptr = head;

while(ptr)

return qptr;

}/* 3

*@brief: 找出鍊錶的中間元素

*/const listnode *findmidelement(const listnode *head)

if(twostep)

if(twostep)

} return onestep;

}/* 4

*@brief: 在單鏈表中刪除值為x的結點 該結點不為最末尾的結點如果為最末尾結點要從頭遍歷一遍進行刪除

*/void deletenodeinlist(listnode *&head, int x)

while(ptr)

preptr = ptr; //記錄前乙個結點

ptr = ptr->next; }}

/* 5

*@brief: 將兩個不交叉的有序列合併成乙個有序序列 用一的頭結點作最終的頭結點

*/void combinetwoorderlists(listnode *&head1, listnode *head2)

if(head1 && head2)else//新的頭結點

newhead = ptr;

taillist = newhead;

newhead->next = null;

} while(head1 && head2)else

ptr->next = null;

taillist->next = ptr;

taillist = taillist->next;

} if(head1)

if(head2)

head1 = newhead;

}/* 6

* @brief: 交換單鏈表任意兩個元素

* @param: head頭指標,k第k個元素第 x第x個元素

* @return: 返回尾指標

*/void swapkthandxthelem(listnode *head, int k, int x)

firstnode = ptr; //找出第乙個結

while(ptr && k)

while(ptr && x)

if(k || x) return; //如果鍊錶沒有那麼元素直接返回

secondnode = ptr;//找出第二個結點

swap(firstnode->val, secondnode->val);

}/* 7

*@brief: 檢測鍊錶是否有環,如果鍊錶有環,乙個指標移動一步,另乙個移動兩步肯定有相交的情況

*/bool checkcircle4list(listnode *head) while (onestep != twostep);

return true;

}/* 8

*@brief:判斷兩個單鏈表是否相交

*/bool istwolistsjoin(listnode *head1, listnode *head2)

//計算鍊錶二的長度

ptr = head2; while(ptr)

int tmplen; //判斷兩個鍊錶哪個更長

if(m > n)

}else

} //找出交點

while(head1 && head2)

return false;

}/* 9-1

* @brief: 模擬快速排序的鍊錶排序演算法 一次分割

* @param: head頭指標,end尾指標,第一次end為null

* @return: 返回尾指標

*/listnode* partation(listnode *head, listnode *end)

jptr = jptr->next; //j++

} swap(head->val, iptr->val); //交換left與i

return iptr;

}/* 9-2

*@brief: 鍊錶排序 如果元素重複太多演算法會退化為n2 n的平方時間複雜度

*@param: head頭指標,end尾指標,第一次end為null

*/void sortlist(listnode *head, listnode *end)

}/* 10

*@brief: 刪除單鏈表中相同的元素,前提相同元素相鄰

*如果不相鄰可以考慮用map或set(最好),或相排序再處理,如果元素範圍固定可以考慮使用hash table

*/void uniquelist(listnode *head)else

}}

單鏈表操作(一)

將乙個帶有頭結點的單鏈表反向輸出 思想 每當訪問乙個結點時,先遞迴輸出它後面的結點 void reverselist linklist l printf d l data 函式呼叫為 reverselist l next 不能從頭結點開始,不然也會輸出頭結點的的值 將乙個鍊錶 a1,b1,a2,b2...

單鏈表(合併單鏈表)

單鏈表遍歷 單鏈表遍歷是從單鏈表頭指標head開始訪問,沿著next指標所指示的方向依次訪問每乙個結點,且每個結點只能訪問依次,直到最後乙個結點為止。遍歷時注意,不要改變head指標的指向。因此一般設定另外的乙個指標變數如p,p從head開始依次訪問乙個結點,直到鍊錶結束,此時p null,完成依次...

一 單鏈表 帶環單鏈表的詳細講解

今天看了一篇關於帶環單鏈表精講的文章,在這裡給大家做乙個總結。之前看過很多有關單鏈表帶環的文章,但是有些文章講的太文章化,不容易理解,理論性太強。接下來我會用最簡單通俗易懂的語言解析這個問題。當你拿到乙個單鏈表的資料資訊時,我相信大部分的人都會選擇去判斷一下這個單鏈表是否有環?這也是最基本的反應。下...