每天一个小算法(4)----在O(1)时间删除指定结点

O(1)时间内删除结点的思路只能是复制该结点下一个结点的数据,然后删除该结点的下一个结点,来等效删除此结点。

需要注意的地方是删除头结点和尾结点的处理。

 1 #include <stdio.h>
 2 #include <time.h>
 3 #include <stdlib.h>
 4 typedef struct Node
 5 {
 6     int data;
 7     Node* next;
 8 }Node, *List;
 9
10 List createList(int num) //随机生成数字,构造链表
11 {
12     List aList = (List)malloc(sizeof(Node));
13     aList->next = NULL;
14     aList->data = 0;
15     Node* qT = aList;
16
17      // srand((int)time(0));
18      for ( int i=0; i< num; ++i)
19      {
20          Node* pTN = (Node*)malloc(sizeof(Node));
21          pTN->data = rand()%100;
22          pTN->next = NULL;
23          qT->next = pTN;
24          qT = pTN;
25      }
26      return aList;
27 }
28
29 void printList(List aList)    //打印链表
30 {
31     if ( aList == NULL || aList->next == NULL )
32         return;
33
34     Node* pT = aList->next;
35     printf("element of list:\n\t");
36     while( pT != NULL )
37     {
38         printf("%d ", pT->data);
39         pT = pT->next;
40     }
41
42     printf("\n");
43 }
44
45 void deleteList(List aList)    //删除链表
46 {}
47
48
49 //删除结点主算法
50 void deleteNode(List aList, Node* pNode)
51 {
52     if ( aList == NULL || pNode == NULL )
53         return;
54
55     if ( aList == pNode )
56     {
57         printf("refuse to delete head node\n");
58         return;
59     }
60
61     if ( pNode->next == NULL )
62     {
63         Node* pT = aList->next;
64         while ( pT->next != NULL )
65         {
66             pT = pT->next;
67         }
68
69         delete pNode;
70         pT->next == NULL;
71     }
72
73     Node* pN = pNode->next;
74     pNode->data = pNode->next->data;
75     pNode->next = pNode->next->next;
76
77     delete pN;
78 }
79
80 int main(int argc, char const *argv[])
81 {
82      srand((int)time(0));
83     List aList = createList(5);
84     printList(aList);
85     deleteNode(aList,aList->next->next);
86     printList(aList);
87     deleteList(aList);
88
89     return 0;
90 }

每天一个小算法(4)----在O(1)时间删除指定结点

时间: 2024-08-06 18:44:16

每天一个小算法(4)----在O(1)时间删除指定结点的相关文章

每天一个小算法(3)----倒序打印链表

这个比较简单,用栈.递归.倒转链表都可以实现,不再过多解释. 代码使用递归实现 1 #include <stdio.h> 2 #include <time.h> 3 #include <stdlib.h> 4 typedef struct Node 5 { 6 int data; 7 Node* next; 8 }Node, *List; 9 10 11 List createList(int num) //随机生成数字,构造链表 12 { 13 List aList

每天一个小算法(2)----合并两个有序链表

每天一个小算法还是有点没时间,尽量抽出时间写一写. 今天是合并有序的链表,对单链表有点忘了,尤其是指针指来指去的,有点晕,幸好基础还算好,想了想还是能想回来. 代码使用随机数函数生成一个链表,然后对链表排序,最后合并链表并打印,删除链表的函数于算法无关紧要,所以未实现^_^. 在Linux/g++下编译运行成功. 合并思路:和合并数组有些类同,比较两个节点的元素大小然后将小的摘下来尾插到链表bList中,然后指针指向下一个节点,最后直接把非空的链表合并到bList的末尾. 1 #include

每天一个小算法(6)---- 通过两个栈实现一个队列

这个算法也很简单,定义两个栈m_aStack.m_bStack,m_aStack负责push()数据,m_bStack负责front()数据. 思路:每一次front()取数据都会检查一下m_bStack是否为空,为空则把m_aStack的所有数据pop()出来push()到m_bStack中. 因为STL里有stack,直接拿来用了,代码使用C++,在linux/g++下编译运行成功: 1 #include <stack> 2 #include <stdio.h> 3 #incl

给定链表的头指针和一个结点指针,在O(1)时间删除该结点

题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点. 具体思路:把头结点的数据直接copy到要删除的结点处,然后头指针向后移动一个结点,再free掉原来的头指针指向的结点,这样等于把要删除的结点删除了.当链表只有一个结点或者要删除的结点是头结点或尾结点时,这种方法也是成立的,所以不需要做特殊的处理.假设链表总共有n个结点,我们的算法在n-1总情况下时间复杂度是O(1),只有当给定的结点处于链表末尾的时候,时间复杂度为O(n).那么平均时间复杂度[(n-1)*O(1)+O(n)]/n,

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点

#include <iostream> #include <string.h> #include <stdlib.h> #include <stack> using namespace std; struct Node { int data; struct Node* next; }; struct Node* create_list(int len) { if (len <= 0) return NULL; struct Node* head; st

一个小算法

今天这里写一个算法 给你一组数字,然后求出这组数中出现次数最多的数以及出现最多的次数. 下面就直接上代码了,主要的注释都会在里面说明. 通过这个算法,可以让我们更好地理解map集合,代码中我写了两种遍历map集合的方法,虽然说掌握一种就可以了,但是毕竟技多不压身,多学点东西还是很好的,尤其是第二种,更应该好好理解一下了,别的不说了,直接上代码. 1 package test; 2 3 import java.util.Collection; 4 import java.util.Collecti

感冒了~ vs中py和vb实现一个小算法

1+1*2+1*2*3+--+1*2*3*n 下面是窗体,就一个按钮和编辑框. 中途还遇到了编码问题,但是感冒太难受,加上明天还要上课.就睡了~ 晚安世界.

经典算法学习——在O(1)时间删除链表节点

这道算法题同样是剑指Offer中的一道题,题目描述为:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点.其实我们知道,想要在单向链表中找到某个节点并删除它,复杂度为O(n),因为必须从头遍历才能找到它(最重要的是因为要找到它的前一个节点.)所以想要O(1)完成,必须想其他的方法. 目前重要的一个信息就是已经有一个节点指针指向当前要删除的节点.这就比较好办了.我们可以非常方便的找到它的后继节点,然后把后继节点的值赋值给当前要删除的节点,然后再去删除那个后继节点.这样,我们

应用小算法

最近在做一个WPF小项目,因为需要处理一些数据,迫不得已写了一个函数,算是一个小算法吧,在此写出以便温故知新,同时希望牛人不吝赐教,点出其中不足之处. 简化需求: 创建一个datatable表dt,dt表中的记录行数是变量m.创建datatable表dt1.dt2,dt1和dt2循环显示dt中的数据,添加一个计时器定时刷新dt1.dt2中的数据,且dt1和dt2每次只能显示n行. 1.声明变量 private DispatcherTimer timer; DataTable dt = new D