链表删减操作 SDTU1138
总结
一题简单题都卡了好久,一开始直接开数组做,一下过了,后来觉得不合题目要求,改用链表,顺带熟悉一下指针操作, 果然一下杯具, 调了很久才出来。
用链表方法,一开始我打算不记录ptr前一个节点,直接检查ptr后一个节点的值,后来发现不行,还是用一个pre,结果发现这样更加简单。
还有一个要注意的是头节点,要开始就记录不是删除数的头节点,一开始忽略了,导致WA
附上两种方法代码
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include<iostream>
2 using namespace std;
3
4 struct element
5 {
6 int value;
7 element* next;
8 };
9
10 int deleteNum (element* & ,int, int);
11
12 int main()
13 {
14 int num;
15 int deletenum;
16 cin >> num;
17
18 element* head = new element;
19 element* ptr = head;
20
21 cin >> head->value;
22 for (int i = 1; i < num; i++)
23 {
24 ptr->next = new element;
25 ptr = ptr->next;
26 cin >> ptr->value;
27 if (i == num - 1)
28 ptr->next = NULL;
29 }
30
31
32 ptr = head;
33 cin >> deletenum;
34 //输出读入的链表
35 cout << num << endl;
36 while (ptr->next != NULL)
37 {
38 cout << ptr->value << " ";
39 ptr = ptr->next;
40 }
41 cout << ptr->value << endl;
42
43 //输出删减后的链表
44 int hold;
45 hold = deleteNum(head, num, deletenum);
46 cout << num - hold << endl;
47 ptr = head;
48 while(ptr->next != NULL)
49 {
50 cout << ptr->value << " ";
51 ptr = ptr->next;
52 }
53 cout << ptr->value << endl;
54
55
56 return 0;
57 }
58
59 //删除链表函数,注意传入的head要是指针的引用,不然,main函数里的指针会没有变化
60 int deleteNum(element* &head, int num, int deletenum)
61 {
62 int b = 0;
63 element* ptr;
64 element* pre;//ptr的前一个节点
65
66 //查找第一个不是删除数的节点
67 while( head != NULL && head->value == deletenum )
68 {
69 head = head->next;
70 b++;
71 }
72 ptr = head->next;
73 pre = head;
74
75 //删除要求的节点
76 while( ptr != NULL )
77 {
78 if (ptr->value == deletenum)
79 {
80 pre->next = ptr->next;
81 delete ptr;
82 ptr = pre->next;
83 b++;
84 }
85 else
86 {
87 pre = ptr;
88 ptr = ptr ->next;
89 }
90
91 }
92 return b;
93 }
94
95
96
97
98
99
100