题目链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list/
分类:
链表(未给头结点,只给待删除节点:迭代修改val、交换节点法)题目给定的可用信息只有待删除节点,没有给定链表的头结点,所以我们能做的只有处理node和它后面的节点。
这样删除node的操作无法用常规的双指针法来实现,感觉这题的考点就是希望你投机取巧。
可以通过迭代修改后续链表的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域置空就能删除尾结点 } }实际上不需要像思路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; } }