資料結構與演算法(3 Reverse鍊錶)

2021-07-03 22:40:48 字數 1125 閱讀 7847

首先個人理解陣列和鍊錶的異同點:

1:陣列是乙個有固定容量的容器,在記憶體中是乙個乙個排列著,有自己的固定長度,雖然可以生成動態陣列,但是不建議,因為消耗記憶體。所以如果想從陣列中插入或者刪除乙個元素的時候,就顯得資源消耗比較大,因為每插入乙個,陣列就要向後移動插入位置之後的每乙個位置。所以陣列在插入刪除中效率是比較低的,然後陣列可以通過index索引,直接查到陣列的對應索引的元素。

2:鍊錶跟陣列是相反的,鍊錶可以動態插入乙個元素,通過指標指向的不同去實現插入刪除,所以顯得非常方便,因為不需要消耗大量的資源去增刪元素,但是,鍊錶由於只有頭,(在這裡我們只考慮頭head)和乙個指標指向,所以比如我想找到某乙個元素的時候,利用鍊錶的效率是非常慢的,乙個乙個從頭開始,肯定比直接拿索引慢。

boom…….反轉鍊錶

斐波那契數列(義大利語: successione di fibonacci),又稱**分割數列、費波那西數列、費波拿契數、費氏數列,指的是這樣乙個數列:0、1、1、2、3、5、8、13、21、……在數學上,斐波納契數列以如下被以遞迴的方法定義:f0=0,f1=1,fn=fn-1+fn-2(n>=2,n∈n*),用文字來說,就是斐波那契數列列由 0 和 1 開始,之後的斐波那契數列係數就由之前的兩數相加。
這個例子主要是用來理解遞迴的

//主要**

public

void

fib(int n)

else

}

從這個例子可以看到,由於每一次都是進行相同的操作,所以可以使用遞迴,也就是呼叫本身

但是,這個演算法的執行效率非常低,因為已經是平方階,後續可以使用標記進行優化。

說回反轉鍊錶

非遞迴反轉**如下:

public node* reverse(node* head)else

return p_pre;

}}

遞迴反轉鍊錶

public node* reverse(node* head)else

}

以上**,如有錯誤,不吝賜教。

資料結構與演算法 二 陣列反轉 reverse

前面我們提到了陣列,現在我們就以陣列來實現反轉 如我們定義乙個陣列 int array 反轉無疑就是將陣列下標第0個元素與下標最後乙個元素互換,然後是第1個元素與倒數第2個元素的互換,依次類推 我們設想陣列長度為基數或偶數都沒有問題 我們需要乙個方法,在方法中就做一件事情,那就是交換元素,在交換元素...

資料結構與演算法 3

非遞迴 o n logn 示例 mergesort 求陣列最小和問題 求陣列中 每個數左側所有比它小的數的和 的和 求降序對問題 陣列中每個數與其右側比它小的數組成的二元組 上題反過來即可 partition過程 給定乙個陣列arr,和乙個整數num,請把小於num的數放在陣列的左邊,大於num的數...

資料結構與演算法 排序演算法(3)

1 原理 將要排序的資料分到幾個有序的桶裡,每個桶裡的資料再進行排序。桶內的資料排序完畢之後,再把桶裡的資料依次取出,組成的序列就是有序的了。2 原地排序?屬於原地排序演算法。主要看桶內排序是否時原地排序演算法,若選擇插入排序,則桶排序就是屬於原地排序,若選擇了快速排序,則不屬於原地排序。3 穩定性...