剑指Offer之 - 在O(1)时间删除链表结点

来源:互联网 发布:企业 大数据战略 编辑:程序博客网 时间:2024/06/01 08:57

题目:

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

思路:

3种情况:1、只有一个结点,且要删除的就是第一个结点???遇到链表时一定要单独考虑只有一个结点的情况
   2、要删除的结点不是最后一个结点,这时不需要查找,直接用后面一个结点的值代替前面一个结点,然后删除后一个结点
   3、要删除的结点是最后一个结点,这时需要先遍历到倒数第二个结点

代码:

#include<iostream>using namespace std;//功能:O(1)时间内删除链表中的某个结点//3种情况:1、只有一个结点,且要删除的就是第一个结点???遇到链表时一定要单独考虑只有一个结点的情况// 2、要删除的结点不是最后一个结点,这时不需要查找,直接用后面一个结点的值代替前面一个结点,然后删除后一个结点// 3、要删除的结点是最后一个结点,这时需要先遍历到倒数第二个结点struct ListNode{int m_nValue;ListNode *m_pNext;ListNode(){}ListNode(int x):m_nValue(x),m_pNext(NULL){}};void DeleteNode(ListNode *pListHead , ListNode *pToBeDeleted){if(pListHead == NULL || pToBeDeleted == NULL)return;ListNode *q = pToBeDeleted->m_pNext;if(q != NULL)//第二种情况{pToBeDeleted->m_nValue = q->m_nValue;pToBeDeleted->m_pNext = q->m_pNext;delete q;q = NULL;return;}if(pListHead == pToBeDeleted)//第一种情况{delete pToBeDeleted;pToBeDeleted = NULL;pListHead = NULL;return;}ListNode *pre = pListHead;while(pre->m_pNext != pToBeDeleted)//第三种情况{pre = pre->m_pNext;}pre->m_pNext = pToBeDeleted->m_pNext;delete pToBeDeleted;pToBeDeleted = NULL;}int main(){ListNode *head = new ListNode(1);ListNode *p2 = new ListNode(2);ListNode *p3 = new ListNode(3);head->m_pNext = p2;p2->m_pNext = p3;ListNode *p = head;//DeleteNode(p , p);//DeleteNode(p , p2);DeleteNode(p , p3);while(p){cout<<p->m_nValue<<endl;p = p->m_pNext;}}


0 0
原创粉丝点击