|
发表于 2017-11-16 10:33:22
|
显示全部楼层
本楼为最佳答案
给你一个时间复杂度为o(1)的方案,还没调试,大概思路是这样的
- typedef int ElementType;
- struct ListNode
- {
- struct ListNode *m_pNext;
- ElementType m_Data;
- };
- void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted)
- {
- assert(pListHead != NULL && pToBeDeleted != NULL);
- if (pToBeDeleted->m_pNext != NULL) //说明还有后继结点
- {
- ListNode *pTmp = pToBeDeleted->m_pNext;
- //直接把后一个结点赋值给要删除的结点
- pToBeDeleted->m_Data = pTmp->m_Data;
- pToBeDeleted->m_pNext = pTmp->m_pNext;
- //然后删除下一个结点
- free(pTmp);
- }
- else if (pListHead != pToBeDeleted) //如果没有后继结点,而且不是头结点
- {
- ListNode *pTmp = pListHead;
- while (pTmp != NULL)
- {
- //找到要删除结点的前一个
- if (pTmp->m_pNext = pToBeDeleted)
- {
- //删除pToBeDeleted结点
- pTmp->m_pNext = pToBeDeleted->m_pNext;
- free(pToBeDeleted);
- break;
- }
- }
- }
- else //说明程序只有头结点,删除的也是头结点
- {
- free(pToBeDeleted);
- pListHead = NULL; //这里这个形参被办法返回,所以这个函数的参数定义的有点问题
- }
- }
复制代码
|
|