演算法 鍊錶常用演算法

2022-08-24 05:12:08 字數 2490 閱讀 2171

常見演算法:

1.鍊錶逆序

2.鍊錶求交點

3.鍊錶求環

4.鍊錶劃分

5.複雜鍊錶的複製

6-a.2個排序鍊錶歸併

6-b.k個排序鍊錶歸併

鍊錶定義:

/*

* * definition for singly-linked list.

* struct listnode

* };

*/

1.鍊錶逆序

classsolution 

returnnew_head;

}};

new_head是新鍊錶的頭指標,next是為了記錄下乙個要反轉的結點指標。

2.鍊錶求交點

class

solution

while

(headb)

}return

null;

}}

用stl 的set,時間複雜度nlogn,判定超時

int get_length(listnode *head)

return

len;

}listnode * get_same_node(int long_len,int short_len,listnode *head)

return

head;

}class

solution

else

while

(heada)

heada=heada->next;

headb=headb->next;

}return

null;

}};

先求出兩個鍊錶長度,然後對齊指標。時間複雜度o(n)

3.鍊錶求環

class

solution

return

false

; }

};

快慢指標。

4.劃分鍊錶

class

solution

else

head=head->next;

}

less->next=morenode.next;

more->next=null;//

注意尾指標清空!!!

return

lessnode.next;

}};

利用兩個頭節點掛上多於x和少於x的節點,最後修改指標,注意尾指標需要清空。

5.複雜鍊錶的複製

class

solution );

cur=cur->next;

old_cur=old_cur->next;

}cur->next=null;

cur=headnode.next;

old_cur=head;

while

(cur)

return

headnode.next;

}};

old_cur為原鍊錶的遍歷指標,cur為新鍊錶的遍歷指標

6-a.2個排序鍊錶的歸併

class

solution

else

p=p->next;

}if(l1==null) p->next=l2;

if(l2==null) p->next=l1;

return

head.next;

}};

6-b.k個排序鍊錶合併

class

solution

for(int i=mid;i)

listnode *l1=mergeklists(sub_list1);

listnode *l2=mergeklists(sub_list2);

return

mergetwolists(l1,l2);

}};

mergetwolists函式是上面的。時間複雜度o(nklogk).

其他演算法題型:

1.刪除指定節點 

class

solution

};

給定的是要刪除的節點的指標,要刪除該節點,由於無法獲取前面節點的next,無法通過修改該next指向後面的節點。

這裡將該節點的值用其後面節點的值替換,再刪除後面的節點,達到等效的作用。

2.獲取中間節點

描述:給定乙個帶有頭結點head的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。

class

solution

return

slow;

}}

快慢指標法。

另一種是將節點指標輸入到陣列,再利用陣列的隨機訪問特性。而隨機訪問正是鍊錶的弱點。

鍊錶及其常用演算法

前言 一 鍊錶的原理 二 鍊錶對應的針對性題目 總結資料結構是用來存資料的,不同的資料結構有不同的特點。有線性儲存和非線性儲存,有連續儲存和非連續儲存,合理的利用資料結構會使得時間複雜度,空間複雜度降低,解決問題更加方便。比如銀行排號,用佇列實現更合適 比如節省記憶體,用不連續的鍊錶更合適。首先鍊錶...

《演算法基礎》 3 5 鍊錶演算法

到目前為止,本章描述了一些用於建立和維護鍊錶的演算法,包括在鍊錶的開頭 結尾和中間新增項的演算法,查詢鍊錶中項的演算法和從鍊錶中刪除項的演算法。以下各節描述了利用其他方式來操作鍊錶的演算法。3.5.1 複製鍊錶 一些演算法重新排列鍊錶。本節和下一節將描述一些對鍊錶中的項進行排序的演算法。如果想保持原...

演算法 鍊錶 鍊錶分隔(鍊錶劃分)

給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3 輸出 1 2 2 4 3 5 兩個臨時頭結點和尾節點,組成兩個鍊錶,分別存放較小和較大節點 完成後...