链表删减操作 SDTU1138

总结

一题简单题都卡了好久,一开始直接开数组做,一下过了,后来觉得不合题目要求,改用链表,顺带熟悉一下指针操作, 果然一下杯具, 调了很久才出来。

用链表方法,一开始我打算不记录ptr前一个节点,直接检查ptr后一个节点的值,后来发现不行,还是用一个pre,结果发现这样更加简单。

还有一个要注意的是头节点,要开始就记录不是删除数的头节点,一开始忽略了,导致WA

 

附上两种方法代码

 

代码
   
     
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  

你可能感兴趣的:(链表)