-
Notifications
You must be signed in to change notification settings - Fork 0
/
day 06 - oj - 3.0
209 lines (203 loc) · 5.03 KB
/
day 06 - oj - 3.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//复制带随机指针的链表
//链表中每个节点有一个指针,那个指针随机指向链表中的一项(无法预测)
//复制链表是好复制的,复制随机指针不好复制
//思路:拷贝一份,每个拷贝节点都在源节点的后面,每个随机指针都在源节点的后面
// 拆解出复制链表
///**
// * Definition for a Node.
// * struct Node {
// * int val;
// * struct Node *next;
// * struct Node *random;
// * };
// */
//typedef struct Node Node;
//struct Node* copyRandomList(struct Node* head)
//{
// if (head == NULL)
// {
// return NULL;
// }
// //拷贝节点到源节点后面
// Node* cur = head;
// while (cur)
// {
// Node* copy = (Node)malloc(sizeof(Node));
// copy->next = NULL;
// copy->random = NULL;
// copy->val = cur->val;
//
// Node* next = cur->next;
// cur->next = copy;
// copy->next = next;
//
// cur = next;
// }
//
// //处理拷贝节点的random(相对关系)
// cur = head;
// while (cur)
// {
// Node* copy = cur->next;
// if (cur->random)
// {
// copy->random = cur->random->next;
// }
// else
// {
// copy->random = NULL;
// }
// cur - cur->next->next;
// }
//
// //拆,拆了之后要连接起来
// cur = head;
// Node* copyHead = head->next;
// while (cur)
// {
// Node* copy = cur->next;
// Node* next = copy->next;
//
// cur->next = next;
// if (next)
// {
// copy->next = next->next
// }
// else
// {
// copy->next = NULL;;
// }
// cur = next;
// }
// return copyHead;
//}
//对链表进行插入排序
//思路:可以认为第一个数是有序的,后面的数插入,变成有序的
//升序插入前面,降序后面,因为单链表不支持从后从后向前,所以用升序
///**
// * Definition for singly-linked list.
// * struct ListNode {
// * int val;
// * struct ListNode *next;
// * };
// */
//typedef struct ListNode Node;
//struct ListNode* insertionSortList(struct ListNode* head)
//{
// if (head == NULL || head->next == NULL)
// {
// return head;
// }
// Node* sortHead = head;
// Node* cur = head->next;
// sortHead->next = NULL;
// while (cur)
// {
// Node* next = cur->next;
//
// //cur插入到sorthead链表中,并且保持有序
// if (cur->val <= sortHead->val)
// {
// //小,头插
// cur->next = sortHead;
// sortHead = cur;
// }
// else
// {
// //中间||尾插
// Node* sortPrev = sortHead;
// Node* sortCur = sortPrev->next;
// while (sortCur)
// {
// if (cur->val <= sortCur->val)
// {
// sortPrev->next = cur;
// cur->next = sortCur;
// break;
// }
// else
// {
// sortPrev = sortCur;
// sortCur = sortCur->next;
// }
// }
//
// //尾插
// if (sortCur == NULL)
// {
// sortPrev->next = cur;
// cur->next = NULL;
// }
// }
//
// cur = next;
// }
// return sortHead;
//}
//删除链表中重复的节点
//思路:三个指针,一个记录前一个节点指针(prev),两个比较相同(cur next)。如果prev记录前一个节点的指针位置,cur和next ferr掉后往后移动如果不一样prev改成这个元素的地址,next为空结束
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @return ListNode类
*/
typedef struct ListNode Node;
struct ListNode* deleteDuplication(struct ListNode* pHead)
{
// write code here
if (pHead == NULL || pHead->next == NULL)
{
return pHead;
}
Node* prev = NULL;
Node* cur = pHead;
Node* next = cur->next;
while (next)
{
if (cur->val != next->val)
{
prev = cur;
cur = next;
next = next->next;
}
else
{
while (next && cur->val == next->val)
{
next = next->next;
}
if (prev)
{
prev->next = next;
}
else
{
pHead = next;
}
//释放
while (cur != next)
{
Node* del = cur;
cur = cur->next;
free(del);
}
if (next)
{
next = cur->next;
}
}
}
return pHead;
}