面试题13:在O(1)时间删除链表结点

来源:互联网 发布:mac联网恢复系统要多久 编辑:程序博客网 时间:2024/05/23 12:33

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。

思路:首先要理解题意,容易误以为是删除值为a的结点,结点指针和头指针都是指向同一个链表,操作

1,链表是否含头结点

2,链表只有一个结点,结点指针指向它

3,结点指针指向链尾,需要顺序遍历,找到结点指针的前一个指针才能进行删除,O(n)

4,结点指针不在链尾,O(1),将结点指针下一个指针赋值相同的值,删除结点指针下一个指针有相同的效果。

如果这个链表含头结点,则第2种情况包含在第4种中

源代码

#include "stdio.h"#include "stdlib.h"typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;void create_head_list(LinkList &L){LinkList p;int e;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;printf("输入链表序列,以0结束:");scanf("%d",&e);while(e){p=(LinkList)malloc(sizeof(LNode));p->data=e;p->next=L->next;L->next=p;scanf("%d",&e);}}//链表含有头结点void DeleteNode(LinkList &head,LinkList p){///if(head->next)LinkList L,q;L=head;if(p->next == NULL){while(L->next != NULL){q=L;L=L->next;}q->next=NULL;}else{p->data=p->next->data;q=p->next;p->next=q->next;free(q);}}void list_traverse(LinkList L){while(L->next!=NULL){printf("%d ",L->next->data);L=L->next;}}void main(){LinkList L;create_head_list(L);LinkList p;p=L->next->next;printf("结点指针指向的数据:%d",p->data);printf("\n输出删除前的链表:");list_traverse(L);DeleteNode(L,p);printf("\n输出删除后的链表:");list_traverse(L);}

结果

第四种情况

输入链表序列,以0结束:1 2 3 4 5 0结点指针指向的数据:4输出删除前的链表:5 4 3 2 1输出删除后的链表:5 3 2 1 

第三种情况

输入链表序列,以0结束:4 5 0结点指针指向的数据:4输出删除前的链表:5 4输出删除后的链表:5 


原创粉丝点击