007 算法:从单链表中删除一个中间节点

原文连接:http://www.pixelstech.net/article/1446199844-Algorithm-%3A-Delete-middle-node-from-singly-linked-list点击打开链接

关于单链表的问题在技术面试中被频繁问到,今天我们就将和你分享一个关于单链表的算法问题,以下是问题描述:

假设你知道的唯一信息是一个指向单链表中某一中间节点的指针,关于这个单链表的其他信息你都不知道,请在不影响单链表结构的前提下删除这个节点。

一开始可能会认为如果你知道头结点这个问题就很简单,不幸的是我们不知道头结点在哪也因此无法知道这个节点的前驱指针。实际上我们有一个巧妙的方法来“删除”这个指针。我们只需要将这个指针后继节点指向的内容覆盖这个指针就行了,而不是删除它。(这样也就使前驱指针的next指向了要删除节点的next指针指向的节点)

下面是一个用C语言写的例子:

#include <stdio.h>
 
struct Node {
    struct Node* next;
    char value;
};
 
// Print the singlely linked list
void printList(struct Node* head){
    while (head != 0){
        printf("%c->", head->value);
        head = head->next;
    }
    printf("null\n");
}
 
// Remove one node from linked list
void removeNode(struct Node* node){
    if (node->next == 0){
        node->value = '0';
        node = 0;
    }
    else {
        struct Node* next = node->next;
        node->value = next->value;
        node->next = next->next;
        next = 0;
    }
}
 
int main(){
    struct Node* a = malloc(sizeof(struct Node));
    struct Node* b = malloc(sizeof(struct Node));
    struct Node* c = malloc(sizeof(struct Node));
    struct Node* d = malloc(sizeof(struct Node));
 
    a->value = 'A';
    b->value = 'B';
    c->value = 'C';
    d->value = 'D';
 
    a->next = b;
    b->next = c;
    c->next = d;
    d->next = 0;
 
    // print the original list
    printList(a);
 
    // remove node c
    removeNode(c);
 
    // print the new list
    printList(a);
 
    free(a);
    free(b);
    free(c);
    free(d);
}
输出结果将会是:

A->B->C->D-null

A->B->D->null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值