【剑指offer】20、删除链表的节点(1)

本文介绍了一种在O(1)时间内删除链表节点的方法,通过覆盖节点内容或调整节点链接来实现快速删除,避免了传统遍历查找的效率瓶颈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

在O(1)时间内删除链表节点。

解题思路

删除链表的两种方法:

1、在删除节点 i 之前,先从链表的头节点开始遍历到i前面的一个节点 h ,把 h 的 next指针 指向i的下一个节点 j ,再删除i。

2、把节点 j 的内容复制覆盖节点 i, 接下来再把节点 i 的next指针指向 j 的下一个节点,再删除节点 j。

测试用例

1、特殊测试

指向链表头节点的为nullptr节点;

指向要删除节点的为nullptr指

2、功能测试

从有多个链表的节点中间删除一个节点;

从有多个节点的链表中删除头节点;

从只有一个节点的链表中删除节点。

代码

package swordOffer;

import java.awt.List;

public class deleteNode {
	public static class ListNode{
		int data;
		ListNode next = null;
		
		public ListNode() {}
		
		public ListNode(int data, ListNode next) {
			this.data = data;
			this.next = next;
		}
	}
	
	public static void deleteNode(ListNode pHead, ListNode pDelNode) {
		if(pHead == null || pDelNode == null) {
			return;
		}
		
		if(pDelNode != null) {//要删除的节点不是尾节点
			ListNode pNext = pDelNode.next;
			pDelNode.data = pNext.data;
			pDelNode.next = pNext.next;
		}else if(pHead == pDelNode) {//
			pHead = null;
			pDelNode = null;
		}else {//链表中有多个节点,删除尾节点
			ListNode pNode = pHead;
			while(pNode.next != pDelNode) {
				pNode = pNode.next;
			}
			pNode.next = null;
		}
	}
	
	public static void main(String[] args) {
		ListNode node4 = new ListNode(4, null);
		ListNode node3 = new ListNode(3, node4);
		ListNode node2 = new ListNode(2, node3);
		ListNode head = new ListNode(1, node2);
		
		deleteNode(head, node2);
		
		while(head != null) {
			System.out.print(head.data + " ");
			head= head.next;
		}
		
	}
}

总结

1、复习链表

2、时间复杂度是:

对于n-1个非尾部结点而言删除的时间复杂度为O(1),对于尾部结点删除而言,仍然需要O(n)的时间复杂度。但是平均时间复杂度是:[ ( n - 1 ) * O( 1 ) + O( n ) ] / n,结果还是O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值