描述
给定一个链表,删除链表中倒数第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));