删除链表中倒数第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));

猜你喜欢

转载自www.cnblogs.com/573583868wuy/p/9446109.html