[链表 技巧] 237. 删除链表中的节点(题目只给待删除节点:迭代修改节点val、交换节点)

    科技2022-07-12  125

    [链表 技巧] 237. 删除链表中的节点(题目只给待删除节点:迭代修改节点val、交换节点)

    237. 删除链表中的节点题目分析思路1:迭代修改节点val + 删除尾结点思路2:交换节点

    237. 删除链表中的节点

    题目链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list/


    分类:

    链表(未给头结点,只给待删除节点:迭代修改val、交换节点法)

    题目分析

    题目给定的可用信息只有待删除节点,没有给定链表的头结点,所以我们能做的只有处理node和它后面的节点。

    这样删除node的操作无法用常规的双指针法来实现,感觉这题的考点就是希望你投机取巧。

    思路1:迭代修改节点val + 删除尾结点

    可以通过迭代修改后续链表的val + 删除尾结点来实现。

    简单来说,就是从node开始迭代地拿后一个节点的val覆盖前一个节点的val,然后把最后一个节点删除即可。

    class Solution { public void deleteNode(ListNode node) { ListNode pre = node, post = node.next; while(post.next != null){ pre.val = post.val; pre = pre.next; post = post.next; } //退出循环时pre指向尾结点的前一个节点 pre.val = post.val;//最后一个节点还未将其值覆盖给pre就退出循环了,所以需要补上 pre.next = null;//将pre的next域置空就能删除尾结点 } }

    思路2:交换节点

    实际上不需要像思路1一样迭代修改每一个节点的val,我们可以把node.next.val赋给node.val,再将node.next指向node.next.next即可。

    例如:4->5->1->9 node = 5,

    令node.val=node.next.val,则链表变为:4->1->1->9,此时node指向第一个1, 还需要再将当前node的next域指向node.next.next:

    node.next = node.next.next;

    则链表变为:4->1->9,删除完成。

    class Solution { public void deleteNode(ListNode node) { node.val = node.next.val; node.next = node.next.next; } }
    Processed: 0.010, SQL: 8