在O(1)时间内删除单链表结点
2014-11-09 11:54
267 查看
题目:
给定单链表的一个结点的指针,同时该结点不是尾结点,此外没有指向其它任何结点的指针,请在O(1)时间内删除该结点。
思路:分两种情况
1.如果不是尾结点,将要删除的结点的下一个结点的值copy到删除结点,这样只要删除下一个结点即可。
2.如果是尾结点,则遍历删除。
总的时间复杂度为O(1)
代码:
#include <stdio.h>
#include <stdlib.h>
#include <stack>
typedef int elem;
typedef struct node
{
elem data;
struct node *next;
}LNode, *LINKLIST;
/*删除链表,时间复杂度O(1),p是要删除的结点*/
void deleteNode(LINKLIST list, LNode* p)
{
LNode* q;
LNode* next;
LNode* node = list;
if (p->next != NULL)
{
/*讲下一个结点的值copy过来*/
q = p->next;
p->data = q->data;
/*讲下一个结点删除即可,用p替换下一个结点*/
p->next = q->next;
/*释放内存*/
free(q);
q = NULL;
}
/*如果为最后一个结点,只能遍历删除*/
else
{
while ((node->next!=NULL) && (node->next!=p))
{
node = node->next;
}
if (node->next == NULL)
{
return;
}
/*按照通用的方式删除*/
next = p->next;
node->next = next;
free(p);
p = NULL;
}
}
/*采用尾插法,创建单链表*/
void createList(LINKLIST list, elem data)
{
LNode* p = list;
LNode* newNode;
while (p->next != NULL)
{
p = p->next;
}
newNode = (LNode*)malloc(sizeof(LNode));
newNode->next = NULL;
newNode->data = data;
p->next = newNode;
}
/*打印单链表*/
void printList(LINKLIST list, void(*print)(elem))
{
LNode* p = list->next;
while (p != NULL)
{
print(p->data);
p = p->next;
}
printf("\n");
}
/*打印结点值*/
void printElem(elem data)
{
printf("%d\t", data);
}
int main()
{
LINKLIST list = NULL;
elem data[] = {1,2,3,4,5,6};
int i;
list = (LINKLIST)malloc(sizeof(LNode));
list->next = NULL;
list->data = 0;
for (i=0; i<6; i++)
{
createList(list, data[i]);
}
printList(list, printElem);
deleteNode(list, list->next->next);
printList(list, printElem);
deleteNode(list, list->next);
printList(list, printElem);
deleteNode(list, list->next);
deleteNode(list, list->next);
deleteNode(list, list->next);
printList(list, printElem);
deleteNode(list, list->next);
printList(list, printElem);
return 0;
}
给定单链表的一个结点的指针,同时该结点不是尾结点,此外没有指向其它任何结点的指针,请在O(1)时间内删除该结点。
思路:分两种情况
1.如果不是尾结点,将要删除的结点的下一个结点的值copy到删除结点,这样只要删除下一个结点即可。
2.如果是尾结点,则遍历删除。
总的时间复杂度为O(1)
代码:
#include <stdio.h>
#include <stdlib.h>
#include <stack>
typedef int elem;
typedef struct node
{
elem data;
struct node *next;
}LNode, *LINKLIST;
/*删除链表,时间复杂度O(1),p是要删除的结点*/
void deleteNode(LINKLIST list, LNode* p)
{
LNode* q;
LNode* next;
LNode* node = list;
if (p->next != NULL)
{
/*讲下一个结点的值copy过来*/
q = p->next;
p->data = q->data;
/*讲下一个结点删除即可,用p替换下一个结点*/
p->next = q->next;
/*释放内存*/
free(q);
q = NULL;
}
/*如果为最后一个结点,只能遍历删除*/
else
{
while ((node->next!=NULL) && (node->next!=p))
{
node = node->next;
}
if (node->next == NULL)
{
return;
}
/*按照通用的方式删除*/
next = p->next;
node->next = next;
free(p);
p = NULL;
}
}
/*采用尾插法,创建单链表*/
void createList(LINKLIST list, elem data)
{
LNode* p = list;
LNode* newNode;
while (p->next != NULL)
{
p = p->next;
}
newNode = (LNode*)malloc(sizeof(LNode));
newNode->next = NULL;
newNode->data = data;
p->next = newNode;
}
/*打印单链表*/
void printList(LINKLIST list, void(*print)(elem))
{
LNode* p = list->next;
while (p != NULL)
{
print(p->data);
p = p->next;
}
printf("\n");
}
/*打印结点值*/
void printElem(elem data)
{
printf("%d\t", data);
}
int main()
{
LINKLIST list = NULL;
elem data[] = {1,2,3,4,5,6};
int i;
list = (LINKLIST)malloc(sizeof(LNode));
list->next = NULL;
list->data = 0;
for (i=0; i<6; i++)
{
createList(list, data[i]);
}
printList(list, printElem);
deleteNode(list, list->next->next);
printList(list, printElem);
deleteNode(list, list->next);
printList(list, printElem);
deleteNode(list, list->next);
deleteNode(list, list->next);
deleteNode(list, list->next);
printList(list, printElem);
deleteNode(list, list->next);
printList(list, printElem);
return 0;
}
相关文章推荐
- [算法浅析] 如何在O(1)的时间里删除单链表的结点
- 在O(1)时间内删除单链表结点
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
- 面试题13:在O(1)时间删除单链表结点
- 剑指offer算法题之单链表的删除结点操作--面试题13:在O(1)时间删除链表结点
- 在 O(1) 的时间内删除单链表的结点
- mtk笔试题-----快速删除单链表中一个结点。时间复杂度为o(1)
- 【数据结构】单链表—在O(1)时间删除链表结点
- 在O(1)时间删除单链表结点
- 设一个没有头结点指针的单链表。一个指针指向此单链表中间的一个结点(不是第一个,也不是最后一个结点),将该结点从单链表中删除,要求时间复杂度O(1)。
- 如何在O(1)的时间里删除单链表的结点
- 在O(1)时间内删除单链表结点
- 在O(1)时间内删除单链表结点
- [算法浅析] 如何在O(1)的时间里删除单链表的结点
- 4,常数时间内删除单链表中某结点
- 在O(1)时间删除链表结点
- 在O(1)时间删除链表结点--总结
- 在O(1)时间内删除链表结点
- O(1)时间删除链表结点
- 给定链表的头指针和一个结点指针,在O(1)时间删除该结点