面试题18:删除链表节点

Posted xlzfdddd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题18:删除链表节点相关的知识,希望对你有一定的参考价值。

18.1 在 O(1) 时间内删除链表节点

<?php
header("content-type:text/html;charset=utf-8");
/*
 * 在 O(1) 时间内删除链表节点。 P119
 */
class ListNode{
    var $val;
    var $next = NULL;
    function __construct($x){
        $this->val = $x;
    }
}
function deleteNode($head,$deleteNode){
    if($head == null || $deleteNode == null){
        return false;
    }
    if($head->next == null){
        return null;
    }
    if($deleteNode->next == null){
        return traverseDelete($head);
    }
    else{
        $deleteNode->val = $deleteNode->next->val;
        $deleteNode->next = $deleteNode->next->next;
        return $head;
    }
}

function traverseDelete($head){
    $cur = $head;
    while ($cur->next->next != null){
        $cur = $cur->next;

    }
    $cur->next = null;
    return $head;
}

$head = new ListNode(1);
$head->next = new ListNode(2);
$head->next->next = new ListNode(3);
$head->next->next->next = new ListNode(4);
$head->next->next->next->next = new ListNode(5);
$deleteNode = $head->next->next->next->next;
print_r(deleteNode($head,$deleteNode));

 

18.2 删除链表中重复的结点

<?php
header("content-type:text/html;charset=utf-8");
/*
 * 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
 * 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。P122
 */
class ListNode{
    var $val;
    var $next = NULL;
    function __construct($x){
        $this->val = $x;
    }
}
function deleteDuplication($pHead)
{
    if($pHead == null || $pHead->next == null){
        return $pHead;
    }

    $next = $pHead->next;

    if($pHead->val == $next->val){  //若头结点与相邻的节点相等,就一直向下遍历到不等的地方,此时next就指向不等的结点
        while ($next != null && $pHead->val == $next->val){
            $next = $next->next;
        }
        return deleteDuplication($next); //以该不等的结点为头,继续向下遍历
    }
    else{
        $pHead->next = deleteDuplication($pHead->next);//若头结点与相邻的节点不等,那就看下一个结点。
    }

    return $pHead;

}

$head = new ListNode(1);
$head->next = new ListNode(1);
$head->next->next = new ListNode(2);
$head->next->next->next = new ListNode(3);
$head->next->next->next->next = new ListNode(3);
$head->next->next->next->next->next = new ListNode(4);
$head->next->next->next->next->next->next = new ListNode(5);
print_r(deleteDuplication($head));

 

以上是关于面试题18:删除链表节点的主要内容,如果未能解决你的问题,请参考以下文章

面试题18:删除链表节点

剑指Offer面试题18. 删除链表的节点

剑指offer——面试题18.1:删除链表中重复的节点

leetcode-面试题18-删除链表的节点

LeetCode JavaScript实现 链表删除节点(重复指定等情况) 题型汇总

面试题18:在O时间删除链表结点