【笔试】31、在O(1)时间删除链表节点

这里借助一下前面的链表类

http://blog.csdn.net/cutter_point/article/details/48004253


/****************************************************************************************
 *题目:在O(1)时间删除链表节点
 *		给定单向链表的头指针和一个节点,定义一个函数在O(1)时间删除该节点
 *时间:2015年8月29日10:14:41
 *文件:DeleteNode.java
 *作者:cutter_point
 ****************************************************************************************/
package bishi.Offer50.y2015.m08.d29;

import bishi.Offer50.y2015.m08.d26.*;

public class DeleteNode
{
	/**
	 * 这里我们的链表的结构是头指针也是一个节点,但是头结点不放任何东西,只是表示头
	 * 
	 * 	————		————		————		————		————
	 * |    | ---》  |data| ---》 |data| ---》 |data| ---》 |data| 
	 *  ————		————        ————        ————        ————
	 *  头												尾节点
	 * @param head
	 * @param pNode
	 */
	public void deleteNode(LinkNode head, LinkNode pNode)
	{
		if(head == null || pNode == null)
		{
			System.err.print("链表为空,或者被删除节点为空");
			return;
		}//if
		
		if(pNode.m_pNext != null)
		{
			//不是尾节点
			LinkNode temp = pNode.m_pNext;
			pNode.m_nValue = temp.m_nValue;
			pNode.m_pNext = temp.m_pNext;
			temp.m_pNext = null;
		}//if
		else
		{
			//是尾节点的删除
			LinkNode tempNode = head.m_pNext;
			while(tempNode.m_pNext != pNode)
			{
				tempNode = pNode.m_pNext;
			}//while
			tempNode.m_pNext = pNode.m_pNext;
		}//else
	}
	
	@org.junit.Test
	public void Test()
	{
		LinkList link = new LinkList();
		link.addTail(8);link.addTail(7);link.addTail(6);link.addTail(5);link.addTail(4);link.addTail(3);
		link.addTail(2);link.addTail(1);link.addTail(0);link.addTail(-1);link.addTail(-2);link.addTail(-3);
		
		System.out.println();
		LinkList.PrintListReversingly_Recursively(link.getHead());
		
		DeleteNode dn = new DeleteNode();
		dn.deleteNode(link.getHead(), link.getHead().m_pNext);
		System.out.println();
		LinkList.PrintListReversingly_Recursively(link.getHead());
	}
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值