基本思路:把要删除的节点的下一个节点复制到当前节点,然后删除被复制了的下一个节点,即使用下一个节点覆盖当前节点达到删除当前节点的目的,时间复杂度为O(1)。当要删除的节点是尾节点时,仍然需要从头结点开始遍历,时间复杂度仍为O(n)。
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//以o(1)的时间删除链表一个节点
LinkList delNode(LinkList head,LinkList dnode)
{
if(head==NULL|| dnode == NULL)
return head;
if(dnode->next != NULL)
{
LinkList node = dnode->next;
//复制下一个节点到当前节点
dnode->next = node->next;
dnode->data = node->data;
free(node);
}
if(dnode->next = NULL)
{
LinkList node = head;
while(node->next != dnode)
{
node = node->next;
}
node->next = NULL;
free(dnode);
}
return head;
}
//创建一个含有n个元素的单链表
LNode *createList(int n){
LNode *head = NULL,*p1,*p2;
for(int i=1;i<=n;i++)
{
p1 = (LinkList)malloc(sizeof(LNode));
if(p1==NULL)
return NULL;
printf("输入链表中第%d个数",i);
scanf("%d",&p1->data);
if(head==NULL)
{
head = p1;
p2 = p1;
}else
{
p2->next = p1;
p2 = p1;
}
}
p2->next = NULL;
return head;
}
//打印链表
void printList(LNode *head){
LNode *p = head;
while(p!=NULL){
printf("%d ",p->data);
p = p->next;
}
}
int main(int argc, char *argv[]) {
//创建顺序链表
LNode *head1 = createList(5);
printList(head1);
printf("\n");
printList(delNode(head1,head1->next));
printList(head1);
printf("\n");
return 0;
}