P13在O(1)时间内删除链表结点
2024-08-23 23:36:27
package offer;
//在 O(1)时间删除链表结点 public class Problem13 {
public static void main(String[] args) {
ListNode node1 = new ListNode();
ListNode node2 = new ListNode();
ListNode node3 = new ListNode();
ListNode node4 = new ListNode();
node1.nextNode = node2;
node2.nextNode = node3;
node3.nextNode = node4;
node1.value = 1;
node2.value = 2;
node3.value = 3;
node4.value = 4;
System.out.println(node1.value);
System.out.println(node2.value);
System.out.println(node3.value);
System.out.println(node4.value);
//deleteNode(node1, node3);
//deleteNode(node1, node1);
//deleteNode(node1, node2);
//deleteNode(node1, node4);
deleteNode(node1, null);
System.out.println(node1.value);
System.out.println(node1.nextNode.value);
System.out.println(node1.nextNode.nextNode.value);
//System.out.println(node4.value);
}
public static void deleteNode(ListNode head,ListNode deleteNode){
if(head == null || deleteNode == null)return;
if(deleteNode == head && head.nextNode == null)//delete head
{
head = null;
}else
{
if(deleteNode.nextNode == null)
{//delete tail,traverse loop
ListNode temp = head;
while(temp.nextNode.nextNode != null)
{
temp = temp.nextNode;
}
temp.nextNode = null;
}
else
{
deleteNode.value = deleteNode.nextNode.value;
deleteNode.nextNode = deleteNode.nextNode.nextNode;
}
} }
}
不用全部遍历链表,对比,删除;
把deleteNode的下一个结点复制到deleteNode的位置,覆盖deleteNode(实际上是删除deleteNode的下一个结点)
注意考虑用例:
结点只有一个的链表;
删除有多个结点的链表尾结点(遍历);
删除空结点,链表为空;
删除有多个结点的链表的中间一个结点。
最新文章
- java第四次作业
- Asp.net(C#) windows 服务{用于实现计划任务,事件监控等}
- poj 2299 Ultra-QuickSort(求逆序对)
- 深入理解Java内存模型(二)——重排序
- Jmeter初步使用三--使用jmeter自身录制脚本
- DJANGO,获取当前用户名,用户组名,用户组权限
- dom0的cpu hotplug【续】
- VC2013 添加库文件
- Nginx基础教程PPT
- Androida规划nt打包
- cord-in-a-box 2.0 安装指南
- ORACLE启动报错ORA-03113: end-of-file on communication channel
- dskinlite自适应dpi
- css笔记详解(1)
- HTTP 压力测试工具
- 简单数论总结1——gcd与lcm
- P2670扫雷
- 优雅的将Map转为String工具类
- Oracle IF-ELSE 条件判断结构
- 洛谷 P1436 棋盘分割 解题报告