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等操作 如何擴容 容量的設定等。鍊錶的考察更側重於 的書寫和思路的形成。雖然說,鍊...