首页 > 代码库 > 剑指offer (13) O(1)时间删除单链表结点
剑指offer (13) O(1)时间删除单链表结点
单链表删除结点操作:
方法一. 从链表的第一个结点开始遍历,顺序遍历到需删除结点的前一个结点,然后调整指针指向 T(n) = O(n)
方法二. 将 需删除结点i的下一个结点j(如果存在) 的值赋值给 需删除结点i,然后 删除结点j,这就相当于删除了结点i T(n) = O(1)
需要注意以下几点:
1. 如果待删除结点为单链表尾结点,此时 其后无后继结点,这时需要 从链表开头开始 顺序遍历查找 待删除结点的前驱结点
2. 如果单链表就只有一个结点,且需要删除头结点,此时 需要修改链表头结点指针 指向 NULL
3. O(1)方法的前提是 待删除结点一定存在于 单链表之中
1 void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted) 2 { 3 if(!pListHead || !pToBeDeleted) 4 return; 5 6 // 要删除的结点不是尾结点 7 if(pToBeDeleted->m_pNext != NULL) 8 { 9 ListNode* pNext = pToBeDeleted->m_pNext; 10 pToBeDeleted->m_nValue = http://www.mamicode.com/pNext->m_nValue; 11 pToBeDeleted->m_pNext = pNext->m_pNext; 12 13 delete pNext; 14 pNext = NULL; 15 } 16 // 链表只有一个结点,删除头结点(也是尾结点) 17 else if(*pListHead == pToBeDeleted) 18 { 19 delete pToBeDeleted; 20 pToBeDeleted = NULL; 21 *pListHead = NULL; 22 } 23 // 链表中有多个结点,删除尾结点 24 else 25 { 26 ListNode* pNode = *pListHead; 27 while(pNode->m_pNext != pToBeDeleted) 28 { 29 pNode = pNode->m_pNext; 30 } 31 32 pNode->m_pNext = NULL; 33 delete pToBeDeleted; 34 pToBeDeleted = NULL; 35 } 36 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。