單向鏈表操做

簡介

鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是經過鏈表中的指針連接次序實現的。鏈表由一系列結點(鏈表中每個元素稱爲結點)組成,結點能夠在運行時動態生成。每一個結點包括兩個部分:一個是存儲數據元素的數據域,另外一個是存儲下一個結點地址的指針域。 相比於線性表順序結構,操做複雜。因爲沒必要須按順序存儲,鏈表在插入的時候能夠達到O(1)的複雜度,比另外一種線性表順序錶快得多,可是查找一個節點或者訪問特定編號的節點則須要O(n)的時間,而線性表和順序表相應的時間複雜度分別是O(logn)和O(1)。node

本文經過c++代碼形式簡單的實現了單向鏈表的增長節點,刪除節點,打印鏈表,和銷燬鏈表操做。ios

 

c++示例代碼

  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5 //單鏈表節點
  6 struct ListNode {
  7     //節點存儲的數字
  8     int m_nValue;
  9     //下一個節點的指針
 10     ListNode* m_pNext;
 11 };
 12 
 13 /************************************************************************/
 14 /* @brif 在鏈表結尾增長節點
 15 /* @param pHead 鏈表頭結點
 16 /* @param value 要增長的節點值
 17 /************************************************************************/
 18 void AddNodeToTail(ListNode** pHead, int value)
 19 {
 20     ListNode *addNode = new ListNode;
 21 
 22     if (!addNode)
 23     {
 24         cout << "add node fail!!!" << endl;
 25         return;
 26     }
 27     addNode->m_nValue = value;
 28     addNode->m_pNext = nullptr;
 29 
 30     //頭結點爲空的狀況,新增長的節點做爲頭結點
 31     if (!*pHead)
 32     {
 33         *pHead = addNode;
 34     }
 35     //頭結點不爲空的狀況,查找到最後一個節點,修改最後一個節點的指向
 36     else
 37     {
 38         ListNode* tmpNode = *pHead;
 39         //找到最後一個頭結點
 40         while (tmpNode->m_pNext)
 41         {
 42             tmpNode = tmpNode->m_pNext;
 43         }
 44         tmpNode->m_pNext = addNode;
 45     }
 46 }
 47 
 48 /************************************************************************/
 49 /* @brif 刪除鏈表中的其中一個節點
 50 /* @param pHead 鏈表頭結點
 51 /* @param value 要刪除的節點值
 52 /************************************************************************/
 53 void removeNode(ListNode** pHead, int value)
 54 {
 55     ListNode* currNode = *pHead;    
 56 
 57     cout << "刪除節點" << value << endl;
 58     if (!currNode)
 59     {
 60         cout << "空鏈表" << endl;
 61     }
 62 
 63     //刪除頭結點
 64     if (currNode ->m_nValue == value)
 65     {
 66         *pHead = currNode->m_pNext;
 67         delete currNode;
 68         return;
 69     }
 70 
 71     //查找要刪除的節點
 72     while (currNode->m_pNext && currNode->m_pNext->m_nValue != value)
 73     {
 74         currNode = currNode->m_pNext;
 75     }
 76 
 77     //找到最後一個都沒找到這個節點
 78     if (!currNode->m_pNext)
 79     {
 80         cout << "沒找到要刪除的節點" << endl;
 81     }
 82     //找到了要刪除的節點,修改節點指針,釋放內存
 83     else
 84     {
 85         ListNode* delNode = currNode->m_pNext;
 86         currNode->m_pNext = currNode->m_pNext->m_pNext;
 87         delete delNode;
 88     }
 89 }
 90 
 91 /************************************************************************/
 92 /* @brif 刪除鏈表中的全部節點
 93 /* @param pHead 鏈表頭結點
 94 /************************************************************************/
 95 void removeAllNode(ListNode** pHead)
 96 {
 97     ListNode* currNode = *pHead;
 98 
 99     if (!*pHead)
100     {
101         cout << "空鏈表" << endl;
102     }
103 
104     ListNode* delNode = nullptr;
105     while ((*pHead)->m_pNext)
106     {
107         delNode = (*pHead);
108         (*pHead) = (*pHead)->m_pNext;
109         delete delNode;
110         delNode = nullptr;
111     }
112     delete (*pHead);
113     *pHead = nullptr;
114 }
115 
116 /************************************************************************/
117 /* @brif 打印鏈表中的節點
118 /* @param pHead 鏈表頭結點
119 /************************************************************************/
120 void printLinkList(ListNode* pHead)
121 {
122     ListNode* currNode = pHead;
123 
124     if (!currNode)
125     {
126         cout << "空鏈表" << endl;
127     }
128 
129     while (currNode)
130     {
131         cout << currNode->m_nValue << "->";
132         currNode = currNode->m_pNext;
133     }
134     cout << "結束" << endl;
135 }
136 
137 int main()
138 {
139     ListNode* pHead = nullptr;
140 
141     cout << "從空連表中依次在尾部插入10個值:" << endl;
142     //空鏈表中依次插入10個值
143     for (int i = 1; i <= 10; ++i)
144     {
145         AddNodeToTail(&pHead, i);
146         printLinkList(pHead);
147     }
148     
149     //刪除節點1
150     removeNode(&pHead, 1);
151     printLinkList(pHead);
152 
153     //刪除節點10
154     removeNode(&pHead, 10);
155     printLinkList(pHead);
156 
157     //刪除節點5
158     removeNode(&pHead, 5);
159     printLinkList(pHead);
160 
161     //刪除不存在的節點11
162     removeNode(&pHead, 11);
163     printLinkList(pHead);
164 
165     //清理現場釋放內存
166     removeAllNode(&pHead);
167 
168     cout << endl;
169     return 0;
170 }

 

測試結果

相關文章
相關標籤/搜索