题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。

链表节点与函数的定义如下。

通常我们删除某个节点都是从头开始遍历到需要删除节点的前一个节点。

然后使得该节点的next指向删除节点的next即可,这样看来删除一个节点

的复杂度为O(n)然而我们其实遍历的目的只是想获取想要删除节点的前一

个节点。

那么我们可以这样考虑:

我们把要删除节点下一个节点的值赋值到当前节点,然后将当前节点的下一个

节点删除即可。

比如:

一个链表3->2->5->7->9给定的指针指向5也就是说要删除5这个节点。

我们将节点5下个节点的值赋值给需要删除的节点即:

3->2->7->7->9

然后再p->next=p->next->next即可删除

代码实现如下:

 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
void deleteNode(struct ListNode* node)
{
if(node==NULL)
return; struct ListNode* p,*q;
q=node;
p=node->next;
q->val=p->val;
q->next=p->next; }

勘误:

上面的方法没有考虑到当要删除的结点是尾结点的情况

因此当需要删除的结点为尾结点的时候这时候仍需要

从头遍历到尾结点的前面一个结点。

但是算法复杂度仍然为1,因为只有一个尾结点需要遍历

整个链表,复杂度为(O(n)+O(1)*(n-1))/n=O(1)

代码实现如下:

 #include <iostream>
using namespace std; /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode
{
int val;
struct ListNode *next;
}; ListNode *head; void deleteNode(struct ListNode* node)
{
if(node==NULL)
return;
if(node->next==NULL)
{
ListNode *TempHead;
TempHead=head;
while(TempHead->next->next!=NULL)
{
TempHead=TempHead->next;
}
TempHead->next=NULL;
return;
} struct ListNode *p,*q;
q=node;
p=node->next;
q->val=p->val;
q->next=p->next;
} ListNode* CreateList()
{
ListNode *Head,*p;
Head=(ListNode*)malloc(sizeof(ListNode));
if(Head==NULL)
return NULL; Head->val=;
Head->next=NULL;
p=Head;
while(true)
{
int data;
cout<<"Please input Node data: ";
cin>>data;
if(data==)
{
break;
}
else
{
ListNode* NewNode;
NewNode=(ListNode*)malloc(sizeof(ListNode));
NewNode->val=data;
NewNode->next=NULL;
p->next=NewNode;
p=p->next;
}
} return Head->next;
} void PrintList(ListNode* Head)
{
ListNode *p;
p=Head; while(p!=NULL)
{
cout<<p->val<<",";
p=p->next;
}
} ListNode* GetNodePtr(ListNode* Head)
{
int count;
ListNode* p;
p=Head;
cout<<"Please input the Node Order you want to delete: ";
cin>>count;
int i=;
while(i<count-)
{
p=p->next;
i++;
} return p;
} int main()
{
ListNode *Node;
head=CreateList();
cout<<"The list is: ";
PrintList(head);
cout<<endl;
Node=GetNodePtr(head);
deleteNode(Node);
cout<<"The delete node list is: ";
PrintList(head);
cout<<endl;
return ;
}

测试结果如下:

感谢@rainhard指出这个错误

剑指offer-面试题13.在O(1)时间删除链表节点的更多相关文章

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

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

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

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

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

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

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

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

  5. 【剑指Offer面试题】 九度OJ1518:反转链表

    与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码. 提前想好測试用例(输入非空等等)进行測试改动代码. 题目链接地址: http://ac.jobdu.com/problem.php? ...

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

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

  7. C++版 - 剑指offer 面试题5:从尾到头打印链表 题解

    面试题5:从尾到头打印链表 提交网址: http://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tq ...

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

    #include <iostream> using namespace std; //构造链表结点 struct ListNode { int val; ListNode *next; L ...

  9. 剑指Offer面试题15(Java版):链表中倒数第K个结点

    题目: 输入一个链表.输出该链表中倒数第k哥结点.  为了符合大多数人的习惯,本题从1開始计数.即链表的尾结点是倒数第1个结点. 比如一个链表有6个结点.从头结点開始它们的值依次是1.2.3,4,5, ...

随机推荐

  1. C# WEB API ApiController 修改response header contentType

    var res = Request.CreateResponse(HttpStatusCode.OK, file); res.Content.Headers.ContentType = new Med ...

  2. Web UI 网站用户界面设计命名规范

    Web UI 网站用户界面设计命名规范 WEB UI设计命名规范,也就是网站用户界面设计(网页设计)命名规范. 这套规范并非单纯的CSS.html或JavaScript命名规范,它涉及了很多使用Pho ...

  3. hdu4010-Query on The Trees(lct分裂合并加值查询最大值)

    代码 #include<cstdio> #include<cstring> #include<string> #include<vector> #inc ...

  4. 【LeetCode练习题】Valid Palindrome

    Valid Palindrome Given a string, determine if it is a palindrome, considering only alphanumeric char ...

  5. UVALive 6190 Beautiful Spacing (2012 Tokyo regional)

    Beautiful Spacing 题意是给一个文本排版,求在满足题目所给要求的条件下,最长连续空格最小是多少. trick: 贪心地模拟是错的,至少无法证明正确性. 正解应该是二分答案+验证. 比较 ...

  6. Java Class 字节码文件结构详解

    Class字节码中有两种数据类型: 字节数据直接量:这是基本的数据类型.共细分为u1.u2.u4.u8四种,分别代表连续的1个字节.2个字节.4个字节.8个字节组成的整体数据. 表:表是由多个基本数据 ...

  7. Live555 分析(二):服务端

    live555支持单播和组播,我们先分析单播的流媒体服务端,后面分析组播的流媒体服务端. 一.单播的流媒体服务端: // Create the RTSP server: RTSPServer* rts ...

  8. [Immutable,js] Iterating Over an Immutable.js Map()

    Immutable.js provides several methods to iterate over an Immutable.Map(). These also apply to the ot ...

  9. jquery 底部导航透明度变化

    如果滚动条到达底部,footer-nav 的透明度为1,否则为0.8: html <div class="footer-nav" id="footer"& ...

  10. ArcEngine 添加字段

    private void AddField(IFeatureClass pFeatureClass, string name, string aliasName, esriFieldType Fiel ...