Write a function to delete a node (except the tail) in a singly linked list, given only access to that node.

Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value 3, the linked list should become 1 -> 2 -> 4 after calling your function.

写一个函数来删除单链表中的一个节点(除了尾部),只允许访问那个节点。
假设链表是1 - > 2 - > 3 - > 4,你得到了第三个值为3的节点,在调用你的函数后,链表应该变成1 - >2 -> 4。

节点代码:

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/

思路:容易想到,传入一个node,在只允许访问node 的情况下,可以知道的值有: node.val,  node.next,node.next.val,node.next.next.....(若非空)

假设有一个链表如图所示  :node 是节点2,它前面有节点1,后面有节点3。结合题意,如下步骤进行删除:

  1. 如果删除掉或者用节点3代替node(节点2),那么节点1将会丢失,因为并不能改掉1.next的指向,因此要保留node节点和它的前驱节点。
  2. 在保留节点node的情况下,只需把node.next节点(即节点3)的值去替换节点node的值,那么这个node将会变成节点3,即伪删除了(并没有真正从内存空间删除node,只是替换值而已)(蓝色线条)
  3. 再把最后一个节点(节点4)替换节点3,即node.next=node.next.next,真正从内存空间删除了node.next(即节点3被删除了,节点4替代了节点3)(棕色线条)
  4. 最后,得到一个删除了node的节点的链表(然而实际删除的是node.next,node只是值替换了而已)

                        

代码如下:

public class Solution {
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
}

最新文章

  1. sql case when...then...else...end 选择判断
  2. webpack 配置文件
  3. ApiAuthValue鉴权机制总结
  4. 基于iSCSI的SQL Server 2012群集测试(一)--SQL群集安装
  5. android学习链接
  6. 使用 json_in_java
  7. [div+css]竖排菜单
  8. android使用其他应用打开文件
  9. Codevs 1097 校门外的树
  10. html5标签兼容ie6,7,8
  11. APNS 那些事!
  12. 算法线性编程珠玑读书笔记之----->使用线性算法求解连续子序列的最大和
  13. [NOIP2013/Codevs3287]货车运输-最小[大]生成树-树上倍增
  14. mysql中使用show table status 查看表信息
  15. 数据结构(java版)学习笔记(一)——线性表
  16. (转载)Unity 关于动态监听时,点击Button,返回其在数组中的下标
  17. ceph Luminous版手动安装零散记录
  18. Visual Studio安装SVN插件
  19. spring boot 之如何在两个页面之间传递值(转)
  20. zabbix 短信报警

热门文章

  1. 201521123085 《java程序设计》 第9周学习总结
  2. Jquery基础添加删除内容
  3. 数据库Mysql的安装及操作---数据引擎
  4. appium 原理解析
  5. PuTsangTo-单撸游戏开发03 碰撞与跳跃瑕疵版
  6. java中Set类接口的用法
  7. Codeforce E. Fire
  8. 一步一步带你做WebApi迁移ASP.NET Core2.0
  9. Floyd算法(最短路)
  10. Hive基础(3)---Fetch Task(转)