博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每天一道算法题(4)——O(1)时间内删除链表节点
阅读量:6895 次
发布时间:2019-06-27

本文共 1434 字,大约阅读时间需要 4 分钟。

1.思路

        假设链表......---A--B--C--D....,要删除B。一般的做法是遍历链表并记录前驱节点,修改指针,时间为O(n)。删除节点的实质为更改后驱指针指向。这里,复制C的内容至B(此时B,C同时指向D),删除节点C,即达到间接删除节点B的目的。

        倘若B是链尾节点。则需要线性遍历寻找前驱节点。

        以上思路,时间复杂度为O(1)。

2.代码

struct ListNode{       int        m_nKey;      ListNode*  m_pNext;};void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted){      if(!*pListHead||!pListHead || !pToBeDeleted)            return;       // 非链表尾指针      if(pToBeDeleted->m_pNext != NULL)      {            ListNode* pNext = pToBeDeleted->m_pNext;            pToBeDeleted->m_nKey = pNext->m_nKey;            pToBeDeleted->m_pNext = pNext->m_pNext;             delete pNext;            pNext = NULL;      }      else if(pListHead==pToBeDeleted){	        delete *pListHead;		*pListHead=NULL;		pToBeDelete=NULL;      }       else      {            ListNode* pNode = *pListHead;            while(pNode->m_pNext != pToBeDeleted)            {                  pNode = pNode->m_pNext;                         }             // deleted pToBeDeleted            pNode->m_pNext = NULL;            delete pToBeDeleted;            pToBeDeleted = NULL;//重要,释放所属空间后,指针置空      }}

3.链表查找节点

      1)查找倒数第k个节点:使用双指针,间距为k-1,当,后一个指针指向对尾的时,前一个指针所指即可所求;

      2)奇数个节点链表查找中间节点:设置双指针,初始化指向头结点。一个每次跳两步,一个每次跳一步。当前一个指针指向队尾,后一个指针所指即为所求;

      3)偶数个节点查找中间2个节点:设置双指针,初始化指向头结点。一个每次跳两步,一个每次跳一步。当前一个指针指向队尾,后一个指针所指和后驱节点即为所求;

      4.判断单向链表是否为环形结构。定义两个指针,一个一次两步,一个一次一步,倘若两个指针最后能追上,则为环形结构。

参考

    1.    2.

转载于:https://www.cnblogs.com/engineerLF/p/5393047.html

你可能感兴趣的文章
驰骋工作流引擎-底层开发API 说明文档
查看>>
http://blog.163.com/db_teacher/blog/static/194540298201110723712407/
查看>>
未能解析引用的程序集……因为它对不在当前目标框架……
查看>>
关于nginx架构探究(2)
查看>>
记一次线上gc调优的过程
查看>>
js判断是否处于隐藏状态
查看>>
VS2012 未找到与约束 contractName Microsoft.visualStudio.Text.ITextDocumentFactoryService.... 匹配的导出...
查看>>
一张图了解Python
查看>>
C++专题(三)
查看>>
背包问题(01背包,完全背包,多重背包)
查看>>
洛谷——P2040 打开所有的灯
查看>>
磁盘管理
查看>>
ES6学习笔记之 let与const
查看>>
UIWebView中javascript与Objective-C交互、获取摄像头
查看>>
poj 3461 Oulipo(KMP模板题)
查看>>
libavcodev may be vulnerable or is not supported, and should be updated for play video
查看>>
ECMAScript 5 —— Function 类型 (二)
查看>>
Java Web 自动登录
查看>>
IOS中文本框输入自动隐藏和自动显示
查看>>
邮件发送封装方法
查看>>