描述
給定一個鏈表,刪除鏈表中倒數第n個節點,返回鏈表的頭節點。
鏈表中的節點個數大於等於n
樣例
給出鏈表1->2->3->4->5->null和 n = 2.
刪除倒數第二個節點之后,這個鏈表將變成1->2->3->5->null.
挑戰
O(n)時間復雜度
思路
要刪除倒數第n個節點,我們就要找到其前面一個節點,也就是倒數第n+1個節點,找到這個節點就可以進行刪除
定義兩個指針,p和cur,cur指針向前走,走了n+1步之后,p指針開始走,當cur指針走到鏈表結尾的時候,p指針剛好走到倒數第n+1個節點處
代碼
1 <?php 2 //刪除鏈表中倒數第n個節點,返回鏈表的頭節點 3 4 class Node 5 { 6 public $value; 7 public $next = null; 8 9 public function __construct($value) 10 { 11 $this->value = $value; 12 } 13 } 14 15 /** 16 * @param $node 頭節點 17 * @param $n 倒數第幾個節點 18 * 思路:要刪除倒數第n個節點,我們就要找到其前面一個節點,也就是倒數第n+1個節點,找到這個節點就可以進行刪除 19 * 定義兩個指針,p和cur,cur指針向前走,走了n+1步之后,p指針開始走,當cur指針走到鏈表結尾的時候,p指針剛好走到倒數第n+1個節點處 20 */ 21 function delete($node, $n = 2) 22 { 23 if(empty($node)) 24 { 25 return $node; 26 } 27 $header = new node(0); 28 $header->next = $node;//頭節點不能丟失(有可能是刪除頭節點) 29 $cur = $node; 30 $p = $node;//n的個數比節點數大時,刪除第一個節點 31 //cur指針先移動n步 32 for($i=0; $i<$n; $i++) 33 { 34 $cur = $cur->next; 35 } 36 37 //找到倒數第n+1個節點 38 while($cur->next != null) 39 { 40 $cur = $cur->next; 41 $p = $p->next; 42 } 43 44 //刪除 45 $p->next = $p->next->next; 46 return $header->next; 47 } 48 49 //創建鏈表可封裝成一個方法 50 $A = new Node(1); 51 $B = new Node(2); 52 $C = new Node(3); 53 $D = new Node(4); 54 $E = new Node(5); 55 $A->next = $B; 56 $B->next = $C; 57 $C->next = $D; 58 $D->next = $E; 59 60 echo "<pre>"; 61 print_r(delete($A, 2));