Bootstrap

删除单向链表中的节点

前言

在单链表中只给定需要删除的节点(非尾节点),如何删除该节点,而且不断链。

一、删除单向链表中的节点

请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。

题目数据保证需要删除的节点 不是末尾节点 。
在这里插入图片描述

二、题解

将下一个节点的值与被删除的节点替换,然后有了删除下一个节点的条件,此时删除下一个节点,从而保证不断链。

package com.xhu.offer.tencent;

//删除单向链表中的节点
public class DeleteNode {
    public void deleteNode(ListNode node) {
        //不断将后面的值与前面的值替换,最后删除末节点
        while (true) {
            node.val = node.next.val;
            if (node.next.next == null) break;
            node = node.next;
        }
        node.next = null;
    }

    //把下一个节点作为傀儡
    public void deleteNode2(ListNode node) {
        node.val = node.next.val;
        node.next = node.next.next;
    }

    // Definition for singly-linked list.
    public class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }
    }

}

总结

1)思维不要固定,不一定要删除该节点才能变成删掉该节点的样子。
2)对于题中出现的知识,要回顾其有什么特点,回想各种数据结构有哪些,哪些能配合该题。如链表的特点、二叉搜索树的特点。否则利用不起给的已知条件,让解题变得更难甚至解不出题。

参考文献

[1]LeetCode 原题

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;