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