演算法實現 鍊錶(二)

2021-09-19 18:32:41 字數 3408 閱讀 7607

public

class

reversepartlinked

}public

static node reversepartlinked

(node head,

int from,

int to)

if(head == null || from >= to || from <

1|| to > count)

node pre = fpre == null?head:fpre.next;

node cur2 = pre.next;

pre.next = tpos;

node next = null;

while

(cur2 != tpos)

if(fpre == null)

fpre.next = pre;

return head;

}}

public

class

palindromelinked

}//時間複雜度為o(n),空間複雜度為o(n),利用棧結構將鍊錶的一半元素壓入棧中

public

static

boolean

ispalindrome01

(node head)

if(head.next.next == null)

stack

stack =

newstack

<

>()

; node slow = head;

node quick = head;

while

(quick.next != null && quick.next.next != null)

if(quick.next != null)

slow = slow.next;

while

(!stack.

isempty()

) slow = slow.next;

}return

true;}

//時間複雜度o(n),空間複雜度o(1)

/*思路:將鍊錶的右半部分反轉,使得左右兩部分最後都指向中間節點

** 再從兩邊遍歷依次比較,即可得出結果,最後再將鍊錶右半部分恢復原狀

* */

public

static

boolean

ispalindrome02

(node head)

node node1 = head;

node node2 = head;

//尋找中間節點

while

(node2.next != null && node2.next.next != null)

//反轉右半部分

node node3 = null;

node2 = node1.next;

node1.next = null;

while

(node2 != null)

//判斷是否是回文

boolean flag =

true

; node3 = node1;

node2 = node1;

node1 = head;

while

(node1 != null && node2 != null)

node1 = node1.next;

node2 = node2.next;

}//恢復右半部分

node1 = null;

node2 = node3;

while

(node2 != null)

return flag;

}}

public

class

linkedpartition

}//解法一:時間複雜度o(n),空間複雜o(n),利用臨時陣列

//public

static node linkedpartitionsolution01

(node head,

int pivot)

node cur = head;

int count =0;

while

(cur != null)

cur = head;

node[

] nodearr =

newnode

[count]

;for

(int i =

0;i < nodearr.length ;i++

)//類似荷蘭國旗問題,分塊

int smaller =-1

;int bigger = nodearr.length;

for(

int i =

0;i < bigger;i++

)else

if(nodearr[i]

.value > pivot)

}//拼接鍊錶節點

for(

int i =

0;i < nodearr.length-

1;i++

) nodearr[nodearr.length -1]

.next = null;

return nodearr[0]

;}//高階解法:時間複雜度o(n),空間複雜o(1)

/* * 思路:分別為三個區域建立頭節點和尾節點,遍歷原鍊錶,將鍊錶每個節點掛至對應的區域

* 最後將三個區域連線起來。

* */

public

static node linkedpartitionsolution02

(node head,

int pivot)

node cur = head;

node smaller = null;

node hsmaller = null;

node equal = null;

node hequal = null;

node bigger = null;

node hbigger = null;

node next = null;

//遍歷分別拼接3部分

while

(cur != null)

else

}else

if(cur.value == pivot)

else

}else

else

} cur = next;}if

(hsmaller != null)

else

return hsmaller;}if

(hequal != null)

return hbigger;

}}

排序演算法 鍊錶實現

陣列的高效體現於隨機訪問,插排 快排等排序演算法未用到這一特點,故這兩種排序演算法可基於鍊錶實現 插入排序 迭代器 p順序訪問鍊錶 迭代器 i順序訪問前 p 個元素 主要的操作為 當p i p.value刪除原位置的 p將p插入 i 1 與 i 之間 若為單向鍊錶,儲存 i 1與 p 1 演算法複雜...

線性表之鍊錶的實現(二) 靜態鍊錶實現

這一部分的內容主要參照了這篇帖子 靜態鍊錶 c實現 的內容。並且貼上的說明圖也是來自於這篇帖子,再次特做宣告。什麼是靜態鍊錶 用全域性資料實現的鍊錶叫做靜態鍊錶。由於全域性陣列是儲存在靜態區,又叫做靜態鍊錶。優缺點 優點 缺點 如何實現 乙個陣列邏輯分成兩部分,空閒鍊錶部分和非空閒鍊錶部分。他們都是...

反轉鍊錶的演算法實現

鍊錶是面試裡面經常涉及到的考點,因為鍊錶的結構相比於hashmap hashtable concurrenthashmap或者圖等資料結構簡單許多,對於後者更多面試的側重點在於其底層實現。比如hashmap中entry等操作 如何擴容 容量的設定等。鍊錶的考察更側重於 的書寫和思路的形成。雖然說,鍊...