前言
檢查鍊錶**是否正確的邊界條件:
若煉表為 null,**是否正常執行?
若鍊錶只有乙個結點,**是否正常執行?
若鍊錶只有兩個結點,**是否正常執行?
**邏輯在處理頭結點和尾結點的時候,**是否正常執行?
鍊錶的構造及列印
private
static
class
node
}public
static
void
main
(string[
] args)
public
static
void
display
(node head)
system.out.
println()
;}public
static node init
(int start,
int exclusive)
return head.next;
}
單鏈表逆序/**
* 單鏈表逆序
** @param head
*/public node reverse
(node head)
return prev;
}
合併兩個有序鍊錶// 合併兩個有序鍊錶
public
static node mergetwosortlist
(node head1, node head2)
if(head2 == null)
// 哨兵節點
node head =
newnode(-
1); node p = head;
node h1 = head1;
node h2 = head2;
while
(h1 != null && h2 != null)
else}if
(h1 != null)
if(h2 != null)
return head.next;
}
刪除鍊錶倒數第 n 個結點
宣告快慢兩個指標,讓快指標走 n 步,再讓兩個指標同時後移,直到快指標到指向最後乙個結點時,慢指標的下乙個結點就是要刪除的結點。
public
static node removeinversenode
(node head,
int n)
node p = head;
node prev = head;
// 先讓 p 指標走 n 步
int i =0;
while
(i < n)
i++;}
// 剛好走了 n - 1 步,說明鍊錶只有 n 個節點
if(i == n -1)
// n 大於鍊錶長度的情況
if(p == null)
// 這個時候讓 p 和 prev 一起走
while
(p.next != null)
// p 和 prev 就是差 n 步的距離,這個時候 prev.next 正好是要被刪除的節點
prev.next = prev.next.next;
return head;
}
找出鍊錶的中間結點
宣告快慢指標,慢指標只遍歷乙個結點,快指標速度為 2 倍,當快指標指向鍊錶最後乙個結點,慢指標指向的即是鍊錶的中間結點。
public
static node findmiddlenode
(node head)
node prev = head;
node p = head;
while
(p != null && p.next != null)
return prev;
}
交換鍊錶相鄰元素public
static
void
main
(string[
] args)
// 交換相鄰鍊錶元素值
public
static node swap
(node head)
return head;
}
可參考:7把鍊錶相鄰元素翻轉(交換值法、就地逆序)
鍊錶中環的檢測
參考:鍊錶中環的檢測
鏈表面試題
不改變鍊錶結構,從尾到頭列印單鏈表 遞迴實現 void printlistrevers recursively plist phead printf d phead data 當鍊表非常長的時候,遞迴實現的會導致函式呼叫層級很深,可能導致呼叫棧溢位。用棧不會出現此類情況,顯然用棧實現 的魯棒性會好一...
鏈表面試題
從尾到頭列印單鏈表 棧 遞迴 從尾到頭列印鍊錶 includevoid printtailtohead listnode head while s.empty 空間複雜度o n void printtailtoheadr listnode head cout data 刪除乙個無頭單鏈表的非尾結點 ...
鏈表面試題
typedef int datatype typedef struct node node,pnode,plist void initlist plist pplist void display const plist plist void pushback plist pplist,datatyp...