鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。
使用鍊錶結構可以克服陣列需要預先知道資料大小的缺點,鍊錶結構可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理。鍊錶有很多種不同的型別,單項鍊表、雙向鍊錶和迴圈鍊錶。下面總結鍊錶操作的**實現。
1.單向鍊錶
typedef struct student
node;
// 建立鍊錶
node *createlist()
else
flag = 0;
}head = head->next;
rear->next = null;
return head;
}// 獲取鍊錶長度
int getlistlength(node *head)
return count;
}// 鍊錶內容輸出
void printlist(node *head)
coutnext != null)
if (num == p1->data)
else
coutreturn head;
node *t, *p1, *p2, *p;
p1 = (node *)malloc(sizeof(node));
p1->data = head->data;
p1->next = null;
p = p1;
t = head->next;
while (t != null)
return p2;
}
2.雙向鍊錶
typedef struct student
node;
// 建立鍊錶
node *createlist()
else
flag = 0;
}head = head->next;
head->prev = null;
rear->next = null;
return head;
}
3.迴圈鍊錶
typedef struct node_str
lnode, *linklist;
// 建立迴圈鍊錶(n為迴圈鍊錶中元素總數)
linklist createcircularlist(int n)
return head;
}// 輸出迴圈鍊錶k位置開始的m個元素(k從1開始計算)
void printcircularlist(linklist head, int k, int m)
for (int i=0; idata}
}}
迴圈鍊錶求解約瑟夫問題
// 約瑟夫環(約瑟夫問題):
// 已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,
// 數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複
// 下去,直到圓桌上僅剩1人。
// 約瑟夫問題
void josephus(int n, int m, int k)
// 開始報數,刪除節點
while (n > 1)
temp = head;
p->next = temp->next;
head = temp->next;
free(temp);
n--;
}// 輸出最後留下人的編號
cout 這是乙個簡單的鍊錶操作問題,在leetcode上面有52.7 的通過率,難度是簡單。但是還是想在這裡基於python做一下總結,順便總結一下鍊錶的各種操作。首先先看一下leetcode上面的題目 反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 高階 你可... 1.在鍊錶頭部新增空頭以消除頭部特殊判斷比較常見,用於刪除和新增元素,啞結點的意思就是在head第乙個節點之前設立乙個節點。2.因為鍊錶的操作有限,所以很多時候我們可以把鍊錶中的元素儲存在陣列中,進行操作。3.鍊錶從前往後遍歷元素簡單,但是從後往前遍歷元素確實困難重重,所以我們可以使用棧來儲存資料,... 判斷兩個鍊錶是否有交點 判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點 假設兩個鍊錶都不存在環 相交的煉表示意圖如下所示。兩個沒有環的鍊錶如果是相交於某一結點,如上圖所示,這個結點後面都是共有的。所以如果兩個鍊錶相交,那麼兩個鍊錶的尾結點的位址也是一樣的。程式實現時分別遍歷兩個單鏈表,直到尾結...關於鍊錶的一些操作總結
關於鍊錶的一些總結
鍊錶的一些操作