删除链表一个结点时间复杂度为O(1)

/*剑指offer p119 面试题18 
在O(1)时间内删除链表结点 */
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
    int data;
    struct node *next;
} LinkNode;
LinkNode * createLinkList()
{
    LinkNode *p,*t,*h;
    int x;
    h=(LinkNode *)malloc(sizeof(LinkNode));
    h->next=NULL;
    t=h;
    printf("请输入要创建的节点的值");
    scanf("%d",&x);
    while(x!=-1)
    {
        p=(LinkNode *)malloc(sizeof(LinkNode));
        p->data=x;
        p->next=NULL;
        t->next=p;
        t=p;
        scanf("%d",&x);
    }
    return h;    
}
void printLinkList(LinkNode *h)
{
    LinkNode *p;
    for(p=h->next;p;p=p->next)
    printf("%d ",p->data);
}
LinkNode* deleteNode(LinkNode *h,LinkNode *p)
{
    LinkNode *q;
    if(p->next==NULL)
    {
        for(q=h;q->next!=p;q=q->next);
        q->next=p->next;
        free(p);
    }
    else
    {
        p->data=p->next->data;
        q=p->next;
        p->next=q->next;
        free(q);
    }
    return h;
}
int main(void)
{
    LinkNode * head,*p;
    head=createLinkList();
    //先给定一个链表的节点
   p=head->next;
//    p=head->next->next->next->next; 
    deleteNode(head,p);
    printLinkList(head);
}

上面这个代码是用c语言实现的,本题同时也是LeetCode中的一个题,目前序号是237,后续可能有改变

使用Java实现的代码如下:
 

      public void deleteNode(Num203.ListNode node) {
        node.val=node.next.val;
        node.next=node.next.next;
    }

总体而言的思想就是把当前节点的下一个值存放在当前结点的位置,然后删除当前值的结点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值