这类题主要就是维护2个指针,一快一慢
1求链表中间节点
维护2个指针,一个一次移动一步,一个一次移动2步,当快的指针到达尾部的时候,慢的位置就是中间
function getMid($l)
{
$p1=$l->root->next;
$p2=$l->root->next;
while($p1!=null&&$p1->next!=null&&$p1->next->next!=null){
$p1=$p1->next->next;
$p2=$p2->next;
}
return $p2->value;
}
2求链表中倒数第k个节点,或者删除第k个节点
2.2.7 Remove Nth Node From End of List
描述Given a linked list, remove the nth node from the end of list and return its head.
For example, Given linked list: 1->2->3->4->5, and n = 2.
Aer removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
• Given n will always be valid.
• Try to do this in one pass.
function getK($l,$k)
{
$p1=$l->root->next;
$p2=$l->root->next;
$i=0;
while($p1!=null){
if($i>=$k){
$p2=$p2->next;
}
$p1=$p1->next;
$i++;
}
return $p2->value;
}
3 判断链表中是否存在环形结构,并且求环的入口节点,求环中数的个数
1)判断是否存在环形,一快一慢的二个指针,能相遇则是环形;
2)求环的长度,从第一次相遇到第二次相遇即环的长度$len;
3)环的入口。2个指针,先让其中一个移动$len(环的长度),然后同时移动,当相遇的位置就是入口