在 O(1) 的时间内删除单链表的结点
2017-04-03 20:06
281 查看
分析:之所以是 O(n) ,是因为我们要从头开始查找(因为我们要找到删除结点的前一个结点)。
如果我们把下一个结点的值复制到需要删除的结点上,然后删除下一个结点,这样就相当于把原结点删掉了。
注意:
如果要删除的链表是在链表的尾部,那么我们就需要重新顺序查找了
如果链表中只有一个结点那么,那么我们删除结点后,需要把头节点的指针置空。
如果我们把下一个结点的值复制到需要删除的结点上,然后删除下一个结点,这样就相当于把原结点删掉了。
注意:
如果要删除的链表是在链表的尾部,那么我们就需要重新顺序查找了
如果链表中只有一个结点那么,那么我们删除结点后,需要把头节点的指针置空。
#include <iostream> using namespace std; typedef struct NodeList{ int data ; NodeList * next; }NodeList; typedef NodeList * LinkList; void initNode(LinkList * head){ * head = (LinkList)malloc(sizeof(NodeList)); (* head)->data = 0; (* head)->next = NULL; } void insertNode(LinkList head, int data){ if(head == NULL) return; LinkList p = (LinkList)malloc(sizeof(NodeList)); p->data = data; p->next = NULL; LinkList f = head; while (f->next != NULL) { f = f->next; } f->next = p; } void printfList(LinkList head){ LinkList p = head->next; while(p != NULL){ cout<<p->data; p = p->next; } } void destoryNode(LinkList head){ LinkList p,q; p = head->next; while(p != NULL){ q = p->next; free(p); p = q; } head->next = NULL; } void deleteNode(LinkList* head, LinkList pToBeDeleted){ if((*head) == NULL || pToBeDeleted == NULL) return; //删除的结点不是尾节点 if(pToBeDeleted->next != NULL){ LinkList next = pToBeDeleted->next; pToBeDeleted->next = next->next; pToBeDeleted->data = next->data; free(next); next = NULL; }else if((*head)->next == pToBeDeleted){ // 只有一个结点 free(pToBeDeleted); (*head)->next = NULL; pToBeDeleted = NULL; }else{ // 如果删除的是尾节点 LinkList p = (*head)->next; while(p->next != pToBeDeleted){ p = p->next; } p->next = NULL; free(pToBeDeleted); pToBeDeleted = NULL; } } int main(int argc, const char * argv[]) { LinkList head ; initNode(&head); insertNode(head, 1); deleteNode(&head, head->next); printfList(head); return 0; }
相关文章推荐
- [算法浅析] 如何在O(1)的时间里删除单链表的结点
- 【数据结构】单链表—在O(1)时间删除链表结点
- 在O(1)时间内删除单链表结点
- 在O(1)时间内删除单链表结点
- 剑指offer算法题之单链表的删除结点操作--面试题13:在O(1)时间删除链表结点
- 在O(1)时间删除单链表结点
- mtk笔试题-----快速删除单链表中一个结点。时间复杂度为o(1)
- 面试题13:在O(1)时间删除单链表结点
- 在O(1)时间内删除单链表结点
- 设一个没有头结点指针的单链表。一个指针指向此单链表中间的一个结点(不是第一个,也不是最后一个结点),将该结点从单链表中删除,要求时间复杂度O(1)。
- 如何在O(1)的时间里删除单链表的结点
- 在O(1)时间内删除单链表结点
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
- [算法浅析] 如何在O(1)的时间里删除单链表的结点
- 4,常数时间内删除单链表中某结点
- 在O(1)时间删除链表结点
- 在O(1)时间删除链表结点--总结
- 在O(1)时间内删除链表结点
- O(1)时间删除链表结点
- 给定链表的头指针和一个结点指针,在O(1)时间删除该结点