题目:给定单向链表的头指针和一个结点指针,定义一个函数在o(1)时间删除该结点。链表结点与函数的定义如下:
struct ListNode{
       int m_nValue;
       ListNode *m_pNext;    
}
void DeleteNode(Listnode** pListHead, ListNode* pToBeDeleted);

思路:将要删除的结点的下一个结点的值复制到要删除的结点,删除下一个结点。如果是要删除最后一个结点,则要从头开始搜索。
 
测试用例:
1)功能测试(从有多个结点的链表的中间删除一个结点,从有多个结点的链表中删除头结点,从有多个结点的链表中删除尾结点,从只有一个结点的链表中删除唯一的结点)
2)特殊输入测试(指向链表头结点指针的为null指针,指向要删除的结点为null指针)
 
代码实现:
结点类:
package com.yyq;

/**
* Created by Administrator on 2015/9/13.
*/
public class ListNode {
private int m_nValue;
private ListNode m_pNext; public ListNode(int m_nValue){
this.m_nValue = m_nValue;
} public ListNode getM_pNext() {
return m_pNext;
} public void setM_pNext(ListNode m_pNext) {
this.m_pNext = m_pNext;
} public int getM_nValue() {
return m_nValue;
} public void setM_nValue(int m_nValue) {
this.m_nValue = m_nValue;
}
}

实现类:

package com.yyq;

/**
* Created by Administrator on 2015/9/13.
*/
public class DeleteNodeInList {
public static ListNode deleteNode(ListNode pListHead, ListNode pToBeDeleted){
if (null == pListHead || null == pToBeDeleted) {
return pListHead;
}
//要删除的结点不是尾结点
if (pToBeDeleted.getM_pNext()!= null){
ListNode pNext = pToBeDeleted.getM_pNext();
pToBeDeleted.setM_nValue(pNext.getM_nValue());
pToBeDeleted.setM_pNext(pNext.getM_pNext());
pNext = null;
}
//链表只有一个结点,删除头结点(也是尾结点)
else if(pListHead == pToBeDeleted){
pToBeDeleted = null;
pListHead = null;
}
//链表中有多个结点,删除尾结点
else{
ListNode pNode = pListHead;
while(pNode.getM_pNext() != pToBeDeleted){
pNode = pNode.getM_pNext();
}
pNode.setM_pNext(null);
pToBeDeleted = null;
}
return pListHead;
} public static void printList(ListNode pListHead){
if (pListHead == null)
return;
ListNode pNode = pListHead;
while(pNode!= null){
System.out.print(pNode.getM_nValue()+" ");
pNode = pNode.getM_pNext();
}
System.out.println();
}
// ====================测试代码====================
public static void Test(ListNode pListHead, ListNode pNode)
{
System.out.println("The original list is: ");
printList(pListHead);
if (null == pListHead || null == pNode) {
return ;
}
System.out.println("The node to be deleted is: " + pNode.getM_nValue());
pListHead = deleteNode(pListHead, pNode);
System.out.println("The result list is: ");
printList(pListHead);
System.out.println();
} // 链表中有多个结点,删除中间的结点
public static void Test1()
{
ListNode pNode1 = new ListNode(1);
ListNode pNode2 = new ListNode(2);
ListNode pNode3 = new ListNode(3);
ListNode pNode4 = new ListNode(4);
ListNode pNode5 = new ListNode(5);
ListNode pNode6 = new ListNode(6); pNode1.setM_pNext(pNode2);
pNode2.setM_pNext(pNode3);
pNode3.setM_pNext(pNode4);
pNode4.setM_pNext(pNode5);
pNode5.setM_pNext(pNode6); Test(pNode1, pNode3);
pNode1 = null;
} // 链表中有多个结点,删除尾结点
public static void Test2()
{
ListNode pNode1 = new ListNode(1);
ListNode pNode2 = new ListNode(2);
ListNode pNode3 = new ListNode(3);
ListNode pNode4 = new ListNode(4);
ListNode pNode5 = new ListNode(5);
ListNode pNode6 = new ListNode(6); pNode1.setM_pNext(pNode2);
pNode2.setM_pNext(pNode3);
pNode3.setM_pNext(pNode4);
pNode4.setM_pNext(pNode5);
pNode5.setM_pNext(pNode6); Test(pNode1, pNode6);
pNode1 = null;
} // 链表中有多个结点,删除头结点
public static void Test3()
{
ListNode pNode1 = new ListNode(1);
ListNode pNode2 = new ListNode(2);
ListNode pNode3 = new ListNode(3);
ListNode pNode4 = new ListNode(4);
ListNode pNode5 = new ListNode(5);
ListNode pNode6 = new ListNode(6); pNode1.setM_pNext(pNode2);
pNode2.setM_pNext(pNode3);
pNode3.setM_pNext(pNode4);
pNode4.setM_pNext(pNode5);
pNode5.setM_pNext(pNode6); Test(pNode1, pNode1);
pNode1 = null;
} // 链表中只有一个结点,删除头结点
public static void Test4()
{
ListNode pNode1 = new ListNode(1); Test(pNode1, pNode1);
} // 链表为空
public static void Test5()
{
Test(null, null);
} public static void main(String[] args){
Test1();
Test2();
Test3();
Test4();
Test5();
}
}
输出结果:
The original list is: 
1  2  3  4  5  6  
The node to be deleted is: 3
The result list is: 
1  2  4  5  6  
 
The original list is: 
1  2  3  4  5  6  
The node to be deleted is: 6
The result list is: 
1  2  3  4  5  
 
The original list is: 
1  2  3  4  5  6  
The node to be deleted is: 1
The result list is: 
2  3  4  5  6  
 
The original list is: 
1  
The node to be deleted is: 1
The result list is: 
 
The original list is: 
 

P99、面试题13:在o(1)时间删除链表结点的更多相关文章

  1. 剑指Offer:面试题13——在O(1)时间删除链表结点

    问题描述: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点.链表结点与函数的定义如下: public class ListNode{ int value; ListNode ...

  2. 面试题:在O(1)时间删除链表结点

    题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 链表结点与函数的定义如下: struct ListNode { int m_nValue; ListNode* m_p ...

  3. 剑指offer-面试题13.在O(1)时间删除链表节点

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 链表节点与函数的定义如下. 通常我们删除某个节点都是从头开始遍历到需要删除节点的前一个节点. 然后使得该节点的next ...

  4. 面试题13:在O(1)时间删除链表节点

    http://blog.csdn.net/jsqfengbao/article/details/47175249

  5. 《剑指offer》面试题13 在O(1)时间删除链表节点 Java版

    这道题的关键是知道找到尾节点的前一个节点必须遍历,而且这样做了之后总的时间复杂度还是O(1),以及如何不破坏链表删除一个已知节点 public ListNode delete(ListNode hea ...

  6. (剑指Offer)面试题13:在O(1)时间内删除链表结点

    题目: 在给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点.链表结点与函数的定义如下: struct ListNode{ int val; ListNode* next; } ...

  7. 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点 ...

  8. 【面试题013】在O(1)时间删除链表结点

    [面试题013]在O(1)时间删除链表结点  我们要删除结点i,我们可以把结点i的下一个结点j的内容复制到结点i,然后呢把结点i的指针指向结点j的下一个结点.然后在删除结点j. 1.如果结点i位于链表 ...

  9. 面试题18(一):在O(1)时间删除链表结点

    // 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点.链表结点与函数的定义如下: // struct Lis ...

  10. 题目13 在O(1)时间删除链表节点

    ///////////////////////////////////////////////////////////////////////////////////// // 3. 题目13 在O( ...

随机推荐

  1. makefile--编译出现,未定义的字符

    ld: 0711-317 ERROR: Undefined symbol: .CEntityManager::SetParameter(CString,CString,SColumnInfo) /// ...

  2. 2014-10 u-boot make过程分析

    /** ****************************************************************************** * @author    Maox ...

  3. 在ThinkPHP3.x框架中实现将原创文章第一时间推送到百度收录

    前两天自己写的一篇文章“针对BootStrap中tabs控件的美化和完善”被别的网站给转载了,这也许是值得高兴的一件事情,但是有些网站并没有注明来源和作者.而去百度搜索这篇文章,排名第一的居然是那些转 ...

  4. 【转】sqlserver查询数据库中有多少个表

    sql server 数表: select count(1) from sysobjects where xtype='U' 数视图: select count(1) from sysobjects ...

  5. 一款jquery写出来的tab切换

    当时做这个的时候,当前状态是不规则的,li对应的有3块内容,分别设定不同背景图片,只显示当前的一个背景,鼠标移上去的时候其余2个用background-position: -1000px 0px;来隐 ...

  6. IE下的bug解决方案

    1.IE6下的双边距bug <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  7. ECSHOP如何解决购物车中商品自动消失问题

    最近有客户反映关于ECShop购物车的问题:需要加入多个商品到购物车时,发现之前加入到购物车的商品都自动消失了,只有最后一次加入购物车的商品在里面.那么,这是什么原因呢? 因为ECShop的SESSI ...

  8. Oracle用户进程跟踪

    用户进程跟踪 分为 基于会话级别跟踪和 实例级别跟踪: 会话级别跟踪又包括 当前会话跟踪和 非当前会话跟踪 跟踪文件位置由user_dump_dest设定,大小由max_dump_file_size ...

  9. Pandas之容易让人混淆的行选择和列选择

    在刚学Pandas时,行选择和列选择非常容易混淆,在这里进行一下讨论和归纳 本文的数据来源:https://github.com/fivethirtyeight/data/tree/master/fa ...

  10. if...else..的错误用法

    1.最近在写js代码完成一个前段DOM操作的函数时,自己错误的使用了if..else..控制体.为什么是错误的呢?看看我的 代码你就明白了: document.getElementsByClassNa ...