您的位置:首页 > 职场人生

剑指offer 面试题12 在O(1)时间删除链表节点

2014-08-23 21:58 507 查看
E:\arithmetic\DeleteN1

下一个节点内容挪到要删除节点,删除下个节点,注意头、尾节点的处理,删除的是尾节点时,时间复杂度为O(n)

#include <stdio.h>
#include <stdlib.h>
typedef struct S_LinkNode{
int value;
struct S_LinkNode *next;
}LinkNode;

void deleteNode(LinkNode **head, LinkNode *Node);
void insertNode (LinkNode	**head, LinkNode *node);
void printfNode(LinkNode *head);

int main(int argc, char *argv[])
{//测试用例:头、尾、中间、仅一个!
LinkNode *head = NULL;
LinkNode *t = NULL;
LinkNode *d = NULL;
int i;
for(i=0 ; i<1 ; i++){
t = (LinkNode*)malloc(sizeof(LinkNode));
t->value = i;
t->next = NULL;
insertNode(&head, t);
if(i == 0)
d = t;
}
printfNode(head);

deleteNode(&head, d);
printfNode(head);

return 0;
}
void deleteNode(LinkNode **head, LinkNode *node){
if((head == NULL)||(*head == NULL)){
printf("link is null!quit!\n");
}
else{
if(node == NULL)
return;
if(node == *head){
*head = (*head)->next;
free(node);
return;
}
LinkNode *t = node->next;
if(t != NULL){
node->value = t->value;
node->next = t->next;
node = t;
}
else{
t = *head;
while((t->next != NULL)&&(t->next != node))
t = t->next;
if(t->next == node){
t->next = NULL;
}
else{
printf("can't find!\n");
return;
}
}

free(node);
}
}
void insertNode (LinkNode	**head, LinkNode *node){
if(node == NULL){
return;
}
LinkNode *h = *head;
if(h == NULL){
*head = node;
}
else{
while(h->next != NULL)
h = h->next;
h->next = node;
}
}

void printfNode(LinkNode *head){
if(head == NULL)
printf("null");
else{
while(head != NULL){
printf("%d\t", head->value);
head = head->next;
}
printf("\n");

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: