常見演算法:
1.鍊錶逆序
2.鍊錶求交點
3.鍊錶求環
4.鍊錶劃分
5.複雜鍊錶的複製
6-a.2個排序鍊錶歸併
6-b.k個排序鍊錶歸併
鍊錶定義:
/** * definition for singly-linked list.
* struct listnode
* };
*/
1.鍊錶逆序
classsolutionreturnnew_head;
}};
new_head是新鍊錶的頭指標,next是為了記錄下乙個要反轉的結點指標。
2.鍊錶求交點
classsolution
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.鍊錶求環
classsolution
return
false
; }
};
快慢指標。
4.劃分鍊錶
classsolution
else
head=head->next;
}
less->next=morenode.next;
more->next=null;//
注意尾指標清空!!!
return
lessnode.next;
}};
利用兩個頭節點掛上多於x和少於x的節點,最後修改指標,注意尾指標需要清空。
5.複雜鍊錶的複製
classsolution );
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個排序鍊錶的歸併
classsolution
else
p=p->next;
}if(l1==null) p->next=l2;
if(l2==null) p->next=l1;
return
head.next;
}};
6-b.k個排序鍊錶合併
classsolution
for(int i=mid;i)
listnode *l1=mergeklists(sub_list1);
listnode *l2=mergeklists(sub_list2);
return
mergetwolists(l1,l2);
}};
mergetwolists函式是上面的。時間複雜度o(nklogk).
其他演算法題型:
1.刪除指定節點
classsolution
};
給定的是要刪除的節點的指標,要刪除該節點,由於無法獲取前面節點的next,無法通過修改該next指向後面的節點。
這裡將該節點的值用其後面節點的值替換,再刪除後面的節點,達到等效的作用。
2.獲取中間節點
描述:給定乙個帶有頭結點head
的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。
classsolution
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 兩個臨時頭結點和尾節點,組成兩個鍊錶,分別存放較小和較大節點 完成後...