刪除鏈表中倒數第n個節點


描述

給定一個鏈表,刪除鏈表中倒數第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));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM