码迷,mamicode.com
首页 > 编程语言 > 详细

删除单链表某个结点(Java版)

时间:2015-01-17 11:17:47      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:删除结点   某个结点   java数据结构   java单链表   链表删除结点   

题目:删除带头结点的单链表L中的结点p,p不是最后一个结点,要求时间复杂度为O(1)。

解题思路:
如果不要求时间复杂度为O(1),我们可以找出p的前驱结点,然后很容易就删除p。

现在要求时间复杂度为O(1),因为p不是最后一个结点,知道结点p我们可以删除p的后继结点,那么我们可以把p的后继结点元素的值赋给p结点元素的值。


ADT定义:

//单链表的结点类
class LNode{
	//为了简化访问单链表,结点中的数据项的访问权限都设为public
	public int data;
	public LNode next;
}

算法实现:

public class LinkListUtli {
	public static void deleteNode(LNode p)
	{
		if(p==null||p.next==null) return;//如果p为空或为单链表中最后一个结点不符合题意,直接返回
		LNode q=p.next;//q为p的后继结点
		p.data=q.data;
		p.next=q.next;//从单链表中删除结点q
	}
}

拓展:如果删除的结点p可能是最后一个结点,怎么办。

解题思路:此时只能保证删除结点的平均时间复杂度为O(1),当p不是最后一个结点,时时间复杂度为O(1),当p是最后一个结点时,时间复杂度为O(n)。

算法实现:

public class LinkListUtli {
	public static void deleteNode(LNode L,LNode p)
	{
		if(p==null||L==null) return;//如果p为空或单链表L为空不符合题意,直接返回
		if(p.next != null) //如果p不是最后一个结点
		{
			LNode q=p.next;//q为p的后继结点
		    p.data=q.data;
		    p.next=q.next;//从单链表中删除结点q
		}
		else //如果p是最后一个结点
		{
			LNode pre=L;//用pre表示p的前驱结点
			while(pre.next != null) //保持pre有后继结点
			{
				if(pre.next==p)//如果pre是p的前驱结点
				{
					pre.next=p.next;//将结点p从单链表中删除
				}
			}
		}
		
	}
}


删除单链表某个结点(Java版)

标签:删除结点   某个结点   java数据结构   java单链表   链表删除结点   

原文地址:http://blog.csdn.net/lavor_zl/article/details/42803431

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!