一、鍊錶與陣列的 區別
1、邏輯結構 陣列必須事先定義固定的長度 不能動態的增減 鍊錶是動態分配記憶體
2、記憶體結構 陣列從棧中分配空間 鍊錶在堆中
3、陣列在記憶體中順序儲存 鍊錶隨機儲存 陣列訪問效率高 鍊錶插入刪除方便
4、陣列存在越界問題
定義表頭, 為方便操作 表頭資料域為空
二、單鏈表插入 刪除
bool insertlist(list head, type x, int index)
if(p==null) return error;
node *tmp = (node *)malloc(sizeof(node));
tmp->data = x;
tmp->next = p->next; //tmp的後繼指向原index位置的結點
p-next = tmp; //p的後繼為新結點
return ok;
}bool deletelist(list head, int index)// p->next為第index個
if(p==null || p->next==null || j > i) return error; //i可能為負值
node *tmp = p->next; //tmp指向第index個
p->next = tmp->next; //第index+1個代替index
free(tmp);//釋放空間
return ok;
}三、找出單鏈表中的倒數第k個元素
解題思路
1、先遍歷一遍 計算長度, 再找出後k個
2、雙路齊下 p1從第一位開始,p2從第k為開始遍歷 直到p2走到頭
思路2**:
node* find(node* head, int index)
while(p2!=null)
return p1;
}四、單鏈表反轉
解題思路:每次操作結點時 標註其前結點 後結點 對其進行操作
node* reverse(node *head)
}五、從尾到頭輸出單鏈表
1、遞迴輸出
2、非遞迴輸出
非遞迴操作 :
1).可以使用 「四」 的**進行反轉 然後輸出
2).遍歷結點入棧 然後輸出
六、尋找單鏈表的中間結點
1、遍歷求長度length 然後再遍歷輸出
2、雙路齊下 p1走一步 p2走兩步 p2走到終點時 p1正好到中點
node* findmiddle(node *head)
return p1;
}七、單鏈表排序
與陣列排序區別不大,交換元素時 只交換資料域的內容就好。鍊錶的順序結構不用變化
八、單鏈表中任意 交換兩個元素 (要注意表頭)
將2個結點進行交換 要注意 next指標的 交換問題
//將p q結點交換
node* swap(node* head,node* p,node* q)
if(p==q)
else if(p->next == q)
else if(q->next == p)
else if(p!=q)
return head;
}九、檢測乙個較大的單鏈表是否有環
雙路齊下法 乙個走一步乙個走2步 看是否會相遇
十、判斷兩個(無環)單鏈表是否交叉
判斷最後乙個結點是否相同
十一、刪除單鏈表中的重複結點
雜湊, 建議一hash_map ,遍歷鍊錶 若結點出現重複則刪除
十二、合併兩個有序鍊錶(非交叉)
1、遞迴
node* merge(node* head1, node* head2)else
return head;
}2、非遞迴
node* merge(node*head , node* head1, node* head2)else
}if(head1==null)
tmp->next = head2;
if(head2==null)
tmp->next = head1;
return head;
}
單鏈表各種操作
終於自己寫出了關於單鏈表的操作,而不是看別人的,現在程式設計越來越有感覺了,自己編更好,別人的還看不懂,不知道他們的思路是什麼 單鏈表的建立,插入,刪除,排序,求長度。插入是按大小順序插入的。include include struct node void creat node void print...
單鏈表的各種操作
單鏈表的各種操作 define null 0 typedef char elemtype 字元型資料 typedef struct lnode setnull struct lnode p int length struct lnode p elemtype get struct lnode p,i...
單鏈表的各種操作
單鏈表的各種操作 define null 0 typedef char elemtype 字元型資料 typedef struct lnode elemtype data struct lnode next setnull struct lnode p int length struct lnode...