PHP面试题精选1——链表中倒数第K个结点

输入一个单项链表,输出该链表中倒数第K个结点,倒数第一个结点为链表的最后一个结点,链表结点定义如下:

class ListNode{
    var $val;
    var $next = NULL;
    function __construct($x){
        $this->val = $x;
    }
}

思路一:假设该链表有n个结点,则倒数第k个结点就是从头结点开始第n-k-1个结点。因此可以先遍历一遍链表,获得链表的长度n,然后再从头开始遍历链表到第n-k-1个结点,输出。

思路二:利用栈的后入先出原则,建立一个辅助栈,遍历链表,并将结点依次入栈,然后出栈第k个结点就可以了。

思路三:设置两个指针P1,P2都指向链表的头结点,遍历链表,指针P1先向前移动k-1个结点,然后P1,P2同时向前移动,当P1到达链表尾结点时,P2所指向的就是倒数第k个结点。

思路三的实现代码:

function FindKthToTail($head, $k)
{
    if($head == NULL || $k <= 0)
        return NULL;
    
    $retNode = NULL;
    $pNode = $head;
    $i = 1;
    while($pNode)
    {
        if($i == $k) {
            //当pNode前进了K-1步时,将retNode指向头结点
            $retNode = $head;
        }
        else if($i > $k) {
            $retNode = $retNode->next;
        }
        
        $pNode = $pNode->next;
        $i++;
    }
    
    return $retNode;
}

你可能感兴趣的:(PHP面试题精选1——链表中倒数第K个结点)