設計乙個演算法,刪除乙個單鏈表l中元素值最大的結點,題目保證最大值結點是唯一的。
解:查詢最大值:用p指標遍歷鍊錶,maxp記錄最大值結點
刪除結點:用maxp記錄最大值的前趨結點,同時再增加pre指標實現maxp和maxpre的同步移動
;}該演算法的時間複雜度為o(n)
有乙個帶頭結點的非空單鏈表l,設計乙個演算法使其元素遞增有序排列
解:採用插入排序法的思想,將鍊錶分為有序的部分和無序的部分。其中,只有乙個資料結點的序列可認為有序。
遍歷無序的序列,將元素插入到有序的序列,並根據條件選擇左插還是右插。
void
sort
( linklist *l )
p->next = pre->next;
pre->next = p;
p = q;
//掃瞄原單鏈表餘下的結點
}}
該演算法的時間複雜度為o(n^2)
假設乙個帶頭結點的單鏈表l
l =(
a1,a
2,..
.,an
)l = (a_1, a_2, ...,a_n)
l=(a1
,a2
,...
,an
)設計乙個演算法將所有結點逆置,即
l =(
an,a
n−1,
...,
a1)l = (a_n, a_, ..., a_1)
l=(an
,an−
1,.
..,a
1)解法一:
將l的頭結點單獨拆分出來,採用頭插法重新建表
void
reverse
(linklist* l)
}
解法二:
修改指標域,用三個指標指向乙個結點本身和它前後的兩個結點
void
reverse2
(linklist* l)
rear = current;
current = front;
front = front->next;
} l->next = current;
}
設乙個帶頭結點的單鏈表l
l =(
a1,b
1,a2
,b2,
...,
an,b
n)l=(a_1, b_1,a_2,b_2,...,a_n,b_n)
l=(a1
,b1
,a2
,b2
,...
,an
,bn
)設計乙個演算法將其拆分成兩個帶頭結點的單鏈表l1和l2
l 1=
(a1,
a2,.
..,a
n)l2
=(bn
,bn−
1,..
.,b1
)l_1 =(a_1,a_2,...,a_n)\\ l_2=(b_n,b_,...,b_1)
l1=(a
1,a
2,.
..,a
n)l
2=(
bn,
bn−1
,..
.,b1
)要求l1使用l的頭結點
解:重組l的所有結點
void
split
( linklist *l, linklist *
*l2 )
}
設有乙個僅由紅(0)、白(1)、藍(2)這三種顏色的條塊組成的條塊序列。假設該序列採用單鏈表儲存,設計乙個時間複雜度為o(n)的演算法,使得這些條塊按紅、白、藍的順序排好,即排成荷蘭國旗圖案。
解:用p指標掃瞄結點,根據p->data值將該結點插入到3個單鏈表l、l1、l2(l1和l2不帶頭節)中,最後按l、l1、l2的順序連線起來。
//l的尾結點和l1的首結點連線起來
r1->next = l2;
//l1的尾結點和l2的首結點連線起來
}
演算法設計學習 單鏈表演算法
1 題目 單鏈表a 和 b 帶表頭結點 元素遞增有序。設計演算法將a 和 b歸併成乙個按照元素值依然遞增有序的鍊錶c,c由a和b的結點組成。typedef struct lnode lnode void mergelinkedlist lnode a,lnode b,lnode c 要改變的變數使用...
單鏈表演算法
遍歷 就是把單鏈表中的各個節點挨個拿出來,就叫遍歷 遍歷要點 不能遺漏,不能重複,追求效率 方法 從頭指標 頭節點 順著鍊錶掛接指標依次訪問鍊錶的各個節點,取出這個節點的資料,然後再往下乙個節點,知道最後乙個節點,結束返回 include include include 構建乙個鍊錶的節點 stru...
單鏈表演算法
設帶頭結點的非空單鏈表 l,設計乙個演算法刪除 l 中奇數序號 的結點,即刪除 l 中第 1 3 5 結點。應該是對的,唉,我也忘了 設計演算法刪除單鏈表奇數序號的節點 include include include define elemtype int typedef struct node l...