android bottomnavigationview去掉上陰影_android-ndk-r19c 編譯FFMpeg4.1
阿新 • • 發佈:2021-01-09
技術標籤:資料結構javascript演算法資料結構連結串列
定義:環形連結串列是將 單向連結串列的首尾相連,可以通過頭節點往下再次尋找到頭節點。
連結串列主要作用就是方便刪除和增加節點使用的,在查詢方面有一定的缺陷。
環形連結串列主要用於解決約瑟夫問題
約瑟夫問題:
設編號為 1,2,3,…n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生一個出列編號的序列。
當然這個問題用陣列也能夠實現,這裡僅考慮使用環形連結串列,開啟演算法思路和了解環形連結串列
export default class CricleLinkedList<T>{
private first: Node<T>;
public add(data: T): void {
if (!this.first) {
this.first = new Node(data);
this.first.next = this.first; // 環形連結串列會將首尾相連
} else {
let temp = this.first;
while (temp.next !== this.first) { // 迴圈找到最後一個節點賦值給temp
temp = temp.next;
}
temp.next = new Node<T>(data); // 將最後一個節點的next屬性指向 新增的資料
temp.next.next = this.first; // 將新增的節點的next屬性指向第一個節點,完成首尾相連的環形
}
}
public remove(node: Node<T>): boolean {
let temp = this.first;
let result = false;
while (temp) {
if (temp == node) {
temp.next = temp.next.next;
result = true;
this.showList();
break;
}
temp = temp.next;
}
return result;
}
public getNodeAndRemoveNode(countNum: number, startNo:number): T[] {
let arr = [];
let temp = this.first;
let helper = this.first;
while(true){
if(helper.next == this.first){
break;
}
helper = helper.next;
}
for (let index = 0; index < startNo - 1; index++) { // 第一次同時向後移動找到對應的開始位置
temp = temp.next;
helper = helper.next;
}
while(true){
if(temp == helper){ // 如果helper等於了temp 說明當前連結串列中只存在了一個數據
temp.next = helper;
arr.push(temp.data);
break;
}
for (let index = 0; index < countNum - 1; index++) { // 通過迴圈 countNum-1 次完成移動計數
temp = temp.next;
helper = helper.next;
}
console.log("小孩出圈: " , temp.data);
arr.push(temp.data);
temp = temp.next;
helper.next = temp; // 將helper的下一個節點指向第一個節點,完成首尾連線,方便下一個迴圈使用
}
console.log("最後留存的小孩: " , temp.data);
return arr;
}
public showList() : void{
let temp = this.first;
console.log("--------------------------- 列印連結串列")
while(true){
console.log(" node :" ,temp.data);
if(temp.next == this.first){
break;
}
temp = temp.next;
}
}
}