题目描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点;
思路分析:
代码分析:
#include<iostream>
using namespace std;
struct ListNode
{
int value;
ListNode *next;
};
bool Insert_head(ListNode *list,int value) //头插
{
if(list == NULL)
{
return false;
}
ListNode *node = new ListNode;
node->value = value;
node->next = list->next;
list->next = node;
return true;
}
void Show(ListNode *list)//打印函数
{
if(list == NULL)
return;
ListNode *p = list ->next;
for(;p != NULL;p = p->next)
{
cout<<p->value<<" ";
}
cout<<endl;
}
ListNode* FindValue(ListNode *head,int value) //查找函数
{
ListNode *p = head->next ;
for(;p!=NULL;p=p->next )
{
if(p->value == value)
{
return p;
}
}
return NULL;
}
void DeleteNode(ListNode **pListHead,ListNode *p) //删除函数
{
if(*pListHead == NULL || p==NULL)
return;
if(*pListHead == p)//删头节点
{
delete[] p;
p = NULL;
*pListHead = NULL;
}
else if(p->next == NULL)//删尾节点
{
ListNode *q = *pListHead;
while(q->next != p)
{
q = q->next;
}
q->next = NULL;
delete[] p;
p = NULL;
}
else//删中间
{
ListNode *q = p->next;
p->value = q->value ;
p->next = q->next;
delete[] q;
q = NULL;
}
}
int main()
{
ListNode *head = new ListNode;//申请一个头结点
head ->next = NULL;//把头结点的next域置为NULL
int arr[] = {1,5,8,3,2,48,56};
int lenarr = sizeof(arr)/sizeof(arr[0]);
for(int i=0;i<lenarr;++i)
{
Insert_head(head,arr[i]); //头插
}
Show(head);
ListNode *p1 = FindValue(head,1);
DeleteNode(&head,p1);
Show(head);
ListNode *p2 = FindValue(head,3);
DeleteNode(&head,p2);
Show(head);
ListNode *p3 = FindValue(head,4);
DeleteNode(&head,p3);
Show(head);
ListNode *p4 = FindValue(head,56);
DeleteNode(&head,p4);
Show(head);
return 0;
}
总结:要学会打破常规思维,删除这个结点,肯定和它的前后有关系,前不行,就考虑后面咯。