这里借助一下前面的链表类
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());
}
}