数据结构 链表(一)
生活随笔
收集整理的這篇文章主要介紹了
数据结构 链表(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈表
- 鏈表的時間復雜度
- 單向鏈表與雙向鏈表
- 單向鏈表與雙向鏈表的比較
- 鏈表與數組的比較
- 單向鏈表的C++實現
- 反轉單向鏈表圖解
鏈表是通過 分布在內存各個位置上不同節點相互連接成的一種線性表的數據結構,其特性突出表現為 內存分布零散,因此在數據存儲對內存要求相較于數組而言較低。
鏈表的時間復雜度
單向鏈表與雙向鏈表
單向鏈表:鏈表結構中只有一個next指針,僅僅實現單向傳遞
雙向鏈表:鏈表結構中含有兩個指針,prev和next指針,能夠前后照應
單向鏈表與雙向鏈表的比較
在插入與刪除節點的操作過程中,假設需要操作的節點是鏈表中間某個節點,此時左右相鄰的兩個節點都是存有數據的節點,并非頭尾兩節點,假設需要操作的是在指定節點的前面進行插入或者刪除,此時對于單向鏈表而言,僅僅知道指定節點后的那一個節點,因此,還需知道前一個節點才能進行指針的賦值操作,因此還需進行一次遍歷操作至指定節點的前一個節點并記錄其信息,在此情況下,節點的插入或者刪除的時間復雜度為O(n),但是由于雙向鏈表的前后指針的特殊性使得在此需求下的時間復雜度變為O(1)
當鏈表為有序狀態下時,雙向鏈表的查找比單向鏈表的效率高一些,因為是雙向的,所以可以決定是從頭開始還是從尾開始,再加上有序的前提,所以平均下來雙向鏈表只需要遍歷一半的數據。
綜上所述,雙向鏈表比單向鏈表更加高效,但并不是采取一刀切的方式選取雙向鏈表來應對需求。當內存空間很富裕,倘若追求極致的代碼運行速度,則可以選擇雙向鏈表這種空間復雜度稍高,時間復雜度稍低的數據結構,以空間換取時間;但是在內存空間不充裕的情況下,則需要忽略掉部分運行速度,使得程序能夠安全運行,以時間換空間
鏈表與數組的比較
單向鏈表的C++實現
#pragma once #include<iostream>typedef struct Node {int value;Node* next; }node;class Linklist { private:node* head;int size; public://默認構造函數Linklist();//插入節點,尾插法void AddNode(node* n);//insert采用尾插法,插入pos節點的后面void Insert(int pos, node* n);//刪除pos后的節點void DelNode(int pos);//獲取當前容量int GetLinklistSize();//查找指定元素的位置void FindNode(int value);//釋放空間void FreeNode();//打印鏈表內容void PrintLinklist();//反轉鏈表void ReverseLinklist(); }; #include"linklist.h" #include<iostream> using std::cout; using std::endl;Linklist::Linklist() {this->size = 0;this->head = new node;this->head->value = 0;this->head->next = NULL; }void Linklist::AddNode(node* n) {node* temp = new node;temp->value = n->value;if (n == NULL){cout << "ERROR NODE\n";return;}else if(!this->head->next)//空鏈表{this->head->next = temp;temp->next = NULL;}else //非空鏈表{node* pnode = this->head;for (int i = 0; i < size; ++i){pnode = pnode->next;}pnode->next = temp;temp->next = NULL;}this->size++; }void Linklist::Insert(int pos, node* n) {node* temp = new node;temp->value = n->value;if (pos <= 0 || pos > this->size){cout << "NO SUCH NODE\n";return;}else{node* pnode = this->head;for (int i = 0; i < pos; ++i){pnode = pnode->next;}temp->next = pnode->next;pnode->next = temp;this->size++;} }void Linklist::DelNode(int pos) {if (pos <= 0 || pos > size){cout << "NO SUCH NODE\n";return;}node* pnode = this->head;for (int i = 0; i < pos-1; ++i){pnode = pnode->next;}node* temp = pnode->next;pnode->next = pnode->next->next;this->size--;delete temp; }int Linklist::GetLinklistSize() {return this->size; }void Linklist::FindNode(int value) {node* pnode = this->head;int flag = 0;for (int i = 0; i < size; ++i){pnode = pnode->next;if (pnode->value == value){cout << "[ " << i << " ] ==" << value << endl;flag++;}}if (!flag)cout << "NO SUCH NUMBER YOU WANT\n"; }void Linklist::FreeNode() {if (!this->size)cout << "Linklist is empty\n";else{node* pnode = this->head;for (int i = 0; i <= this->size; ++i){node* temp = pnode;pnode = pnode->next;delete temp;}} }void Linklist::PrintLinklist() {if (!this->size){cout << "NO DATA TO READ\n";return;}else{node* pnode = this->head;for (int i = 0; i < this->size; ++i){cout << "[ " << i + 1 << " ] == " << pnode->next->value << endl;pnode = pnode->next;}} }void Linklist::ReverseLinklist() {if (!this->size){cout << "NO DATA TO READ\n";return;}else{node* pnode = head->next;node* temp;//反轉單向鏈表注意:第一個始終保持在最后一個,更改其next指針// 頭指針也不動,更改自身的next指針即可// 只需要更改一個移動節點,不斷向后逐個移動while (pnode->next){temp = pnode->next;pnode->next = temp->next;temp->next = head->next;head->next = temp;}} } #include"linklist.h"int main() {Linklist lk;node n1 = { 2 };node n2 = { 8 };node n3 = { 15 };node n4 = { 20 };node n5 = { 36 };lk.AddNode(&n1);lk.AddNode(&n2);lk.AddNode(&n3);lk.AddNode(&n4);lk.PrintLinklist();cout << "size == " << lk.GetLinklistSize() << endl;lk.Insert(3, &n1);lk.PrintLinklist();cout << "size == " << lk.GetLinklistSize() << endl;lk.AddNode(&n5);lk.Insert(2, &n4);lk.Insert(4, &n3);lk.PrintLinklist();cout << "size == " << lk.GetLinklistSize() << endl;lk.DelNode(2);lk.PrintLinklist();cout << "size == " << lk.GetLinklistSize() << endl;lk.FindNode(16);lk.FindNode(2);lk.ReverseLinklist();lk.PrintLinklist();return 0; };輸出結果
[ 1 ] == 2 [ 2 ] == 8 [ 3 ] == 15 [ 4 ] == 20 size == 4 [ 1 ] == 2 [ 2 ] == 8 [ 3 ] == 15 [ 4 ] == 2 [ 5 ] == 20 size == 5 [ 1 ] == 2 [ 2 ] == 8 [ 3 ] == 20 [ 4 ] == 15 [ 5 ] == 15 [ 6 ] == 2 [ 7 ] == 20 [ 8 ] == 36 size == 8 [ 1 ] == 2 [ 2 ] == 20 [ 3 ] == 15 [ 4 ] == 15 [ 5 ] == 2 [ 6 ] == 20 [ 7 ] == 36 size == 7 NO SUCH NUMBER YOU WANT [ 0 ] ==2 [ 4 ] ==2 [ 1 ] == 36 [ 2 ] == 20 [ 3 ] == 2 [ 4 ] == 15 [ 5 ] == 15 [ 6 ] == 20 [ 7 ] == 2反轉單向鏈表圖解
總結
以上是生活随笔為你收集整理的数据结构 链表(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构 数组
- 下一篇: 数据结构 链表(二)