原文连接: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