一文輕鬆搞懂 鍊錶反轉

2021-10-23 16:55:04 字數 2767 閱讀 4816

單鏈表反轉(時間複雜度o(n), 空間複雜度o(1))的方法主要有以下三種:

前情提要:

設定乙個鍊錶,帶有頭結點。元素為1->2->3->4

倒轉過來應該是:

1.頭插法

從第二個元素開始,每次選取乙個元素插入到頭結點和第乙個節點之間。

第一步:把2插到head1之間

第二步:把3插入head2之間

第三步:把4插入head3之間

**實現:

static listnode reversebyheadinsert

(listnode head)

return head;

}

2.指標逆轉

原先next指標指向後面,把next指標指向前面,然後head指標指向最後乙個元素即可。相當於把指標方向掉了個,然後把head重新指向鍊錶新的起點。

調轉前

調轉後

設定三個指標,分別指向 前乙個元素p、後乙個元素q、後乙個元素後面的元素res

初始情況:

p 指向 1

q 指向 2

第一次迴圈:

res 指向 3

將 2 的next 指標指向 1(此時1的next仍然指向2,這個我們最後再調整也行)

p 指向 2

q 指向 3

第二次迴圈:

res 指向 4

將 3 的next指標指向2

p 指向 3

q 指向 4

第三次迴圈

res 指向null

將 4 的next指標指向3

p 指向 4

q 指向 null

q==null停止迴圈

static listnode reversebyreversepoint

(listnode head)

head.next.next = null;

head.next = p;

return head;

}

3.遞迴法:也是鍊錶指標方向旋轉

**:

//這裡不傳入頭結點,最終返回值也是最後乙個元素

static listnode reversebyrecursion

(listnode node)

4.**總結

把所有**放在一起,包括listnode的定義。

class

listnode

}public

class

reverselist

return head;

}static listnode reversebyreversepoint

(listnode head)

head.next.next = null;

head.next = p;

return head;

}//這裡不傳入頭結點,最終返回值也是最後乙個元素

static listnode reversebyrecursion

(listnode node)

static

void

printlist

(listnode head)

listnode p = head.next;

while

(p != null)

}public

static

void

main

(string[

] args)

cur.next = null;

// reversebyheadinsert(head);

// reversebyreversepoint(head);

head.next =

reversebyrecursion

(head.next)

;printlist

(head);}

}

一文搞懂transform skew

目錄 如何理解斜切 skew,先看乙個 demo。在下面的 demo 中,有 4 個正方形,分別是 紅色 不做 skew 變換,綠色 x 方向變換,藍色 y 方向變換,黑色 兩個方向都變換,拖動下面的滑塊可以檢視改變 skew 角度後的效果。切換 selector 可以設定 transform or...

一文搞懂property函式

接下來我帶大家了解乙個函式的作用以及使用技巧,希望對大家都有幫助,話不多說,接下來就開始我的表演特性 首先property有兩種用法,一種是作為函式的用法,一種是作為裝飾器的用法,接下來我們就逐一分析 property函式 看一下作為函式它包含的引數都有哪些 property fget none,f...

一文搞懂記憶體屏障

gcc編譯選項中有個 o選項,表示編譯 的時候進行優化。這樣就會出現一種可能 優化後的 和優化前的 順序不一致。來看個例子 8 include9 10 int a,b 11 12 int main 13 很簡單,我們使用不加優化選項來將其編譯為組合語言 yuhao laplace workspace...