單鏈表的演算法設計

2021-10-07 20:21:37 字數 2761 閱讀 5338

設計乙個演算法,刪除乙個單鏈表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...