删除链表节点
来源:互联网 发布:三家运营商的网络制式 编辑:程序博客网 时间:2024/06/16 00:19
问题描述:
给出单链表头指针以及要删除节点的地址,要求写代码删除这个节点,并且时间复杂度为O(1),如何实现?
分析:
(1) 应变能力
(2) 对时间复杂度的理解
平常思路:
prev->next = temp->next;
free(temp);
但是该思路的时间复杂度为O(n)
解题:
不能从phead开始找,入口在所要删除的节点的地址
(1) 将temp后面的节点的数据拷贝到当前temp处,删除最后一个节点空间
(2) 最后一个节点没有下一个节点时,只能采用遍历的方法。
程序代码如下:
#include <stdio.h>#include <stdlib.h>typedef struct node{int data;struct node * next;}Node;//获取链表之前先插入Node * get_link(int length, int local, Node **plocal){Node *temp = NULL;Node *phead = NULL;Node *tail = NULL;int i;//创建单链表for (i = 0; i < length; i++){temp = (Node *)malloc(sizeof(Node));temp->next = NULL;temp->data = length - i;if (phead == NULL){tail = temp;}if (local == length - i)//要删除的节点地址{*plocal = temp;}temp->next = phead;phead = temp;}return phead;}void link_print(Node *temp){while (temp != NULL){printf("%d\t",temp->data);temp = temp->next;}printf("\n");}Node * del_node(Node* phead, Node* local){if (phead == NULL || local == NULL){printf("arg error\n");return NULL;}//(1) 最后一个节点if (local->next == NULL){if(phead == local){free(local);return NULL;}Node * prev = phead;while (prev != NULL && prev->next != NULL){if (prev->next == local){prev->next = prev->next->next;free(local);return phead;}prev = prev->next;}}else{Node * temp = local->next;//temp指向待删除节点的下一个节点local->data = local->next->data; //待删除节点的数据保存为下一个节点的数据local->next = local->next->next;//将下一个节点的地址指向下下一个free(temp);//删除下一个节点return phead;}}int main(){Node * phead = NULL;int local = 0;int number = 0;scanf("%d",&number);//链表的节点数scanf("%d",&local);//要删除的节点if (number < local || local <= 0 || number <= 0){printf("number MUST >= local, and MUST be positive integer\n");exit(EXIT_FAILURE);}Node* plocal = NULL;phead = get_link(number,local,&plocal);link_print(phead);printf("删除数据:%d\n",plocal->data);phead = del_node(phead,plocal);link_print(phead);return 0;}
0 0
- 删除链表节点
- 删除链表节点
- 删除链表节点
- 删除链表节点
- 链表删除节点
- 双向链表 删除节点 插入节点
- 如何删除链表节点
- 单向链表删除节点
- 如何删除链表节点
- 单向链表删除节点
- 单向链表删除节点
- 删除指定链表节点
- 链表给定节点删除
- 双向链表删除节点
- 删除链表中间节点
- 删除链表中间节点
- 单向链表删除节点
- 删除链表重复节点
- cocostudio ui编辑器的使用----代码部分1
- Linux keepalived与lvs的深入分析
- 分布式和集群的概念
- Nginx配置参数说明
- redis 2.6.9安装报错解决
- 删除链表节点
- 有趣的C语言问答
- Intent MIME type介绍
- vision引擎中 地形几何网格导出
- java8的一点感觉和个人看法
- cocos2d-x-3.2 不能混合颜色修改
- android 获取内置存储卡和外置存储卡
- Nginx配置参数说明
- volatile