單鏈表反轉(時間複雜度o(n), 空間複雜度o(1))的方法主要有以下三種:
前情提要:
設定乙個鍊錶,帶有頭結點。元素為1->2->3->4
倒轉過來應該是:
1.頭插法
從第二個元素開始,每次選取乙個元素插入到頭結點和第乙個節點之間。
第一步:把2插到head和1之間
第二步:把3插入head與2之間
第三步:把4插入head與3之間
**實現:
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...