在O(1)时间删除链表结点

来源:互联网 发布:成都地铁 知乎 编辑:程序博客网 时间:2024/06/06 14:22

 题目描述:给定单向链表的头指针和一个结点指针,定义一个函数在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域置为NULLint 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;}
总结:要学会打破常规思维,删除这个结点,肯定和它的前后有关系,前不行,就考虑后面咯。

原创粉丝点击