m********c 发帖数: 105 | 1 昨天发了一个pure storage的题目,发现用double pointer非常容易做。今天认认真真
研究了一下double pointer,感觉虽然不容易掌握,但是掌握了它就很强大。
做leetcode题目Remove Duplicates from Sorted List II时,正好就用上了,下面是
我用double pointer的实现。
ListNode *deleteDuplicates(ListNode *head) {
ListNode **lpp = &head;
int currValue = INT_MAX;
while (*lpp) {
if ((*lpp)->val == currValue) {
*lpp = (*lpp)->next;
}
else if ((*lpp)->next && (*lpp)->val == (*lpp)->next->val) {
currValue = (*lpp)->val;
*lpp = (*lpp)->next;
}
else
lpp = &(*lpp)->next;
}
return head;
}
上面代码,不满意的地方是多用了一个变量currValue,这个是用来删除每个duplicate
elements中的最后一个。暂时还没有想到可以去掉它的方法。 |
b**********5 发帖数: 7881 | |
m********c 发帖数: 105 | 3 通过了,60ms
【在 b**********5 的大作中提到】 : 你这个code, 通过了test么?
|
k******4 发帖数: 94 | 4 如果第一个元素值是int_max怎么办?还有就是这个难道不是内存泄漏了? |
m********c 发帖数: 105 | 5 如果第一个是INT_MAX的话,这个确实不行,这也是我对这个code不满意的地方。
内存泄露也有可能,但是对于这个函数,我们不知道head以及其他next节点是不是new
的,所以没办法决定是否用delete去删除。
有更好的可以确保内存不会泄漏的方法吗?
【在 k******4 的大作中提到】 : 如果第一个元素值是int_max怎么办?还有就是这个难道不是内存泄漏了?
|
w*****e 发帖数: 931 | 6 第一行有个typo, ListNode **lpp。还有你这个没有用delete会有内存泄露吧。
duplicate
【在 m********c 的大作中提到】 : 昨天发了一个pure storage的题目,发现用double pointer非常容易做。今天认认真真 : 研究了一下double pointer,感觉虽然不容易掌握,但是掌握了它就很强大。 : 做leetcode题目Remove Duplicates from Sorted List II时,正好就用上了,下面是 : 我用double pointer的实现。 : ListNode *deleteDuplicates(ListNode *head) { : : ListNode **lpp = &head; : int currValue = INT_MAX; : while (*lpp) { : if ((*lpp)->val == currValue) {
|
m********c 发帖数: 105 | 7 嗯,疏忽,竟然把那个写错了,多谢提醒!
内存泄露是有可能,但是我们不知道head是不是通过new创建的。比如下面的例子。
在函数里,*lpp = (*lpp)->next, 之前加上 delete *lpp
如下定义这个list node,
ListNode node1(1);
ListNode node2(1);
node1.next = &node2;
duplicateNode(&node1)的话就会报错,pointer being freed was not allocated
【在 w*****e 的大作中提到】 : 第一行有个typo, ListNode **lpp。还有你这个没有用delete会有内存泄露吧。 : : duplicate
|
g**4 发帖数: 863 | 8 没仔细看你的代码
leetcode里面double pointer我都是这样做的:
ListNode* newHead = NULL;
ListNode** dp = &newHead;
...
return newHead;
【在 m********c 的大作中提到】 : 昨天发了一个pure storage的题目,发现用double pointer非常容易做。今天认认真真 : 研究了一下double pointer,感觉虽然不容易掌握,但是掌握了它就很强大。 : 做leetcode题目Remove Duplicates from Sorted List II时,正好就用上了,下面是 : 我用double pointer的实现。 : ListNode *deleteDuplicates(ListNode *head) { : : ListNode **lpp = &head; : int currValue = INT_MAX; : while (*lpp) { : if ((*lpp)->val == currValue) {
|
p****U 发帖数: 109 | |
d****n 发帖数: 1241 | 10 想到这个例子:
http://grisha.org/blog/2013/04/02/linus-on-understanding-pointe
当时在hackernews上讨论还颇为激烈。
【在 m********c 的大作中提到】 : 昨天发了一个pure storage的题目,发现用double pointer非常容易做。今天认认真真 : 研究了一下double pointer,感觉虽然不容易掌握,但是掌握了它就很强大。 : 做leetcode题目Remove Duplicates from Sorted List II时,正好就用上了,下面是 : 我用double pointer的实现。 : ListNode *deleteDuplicates(ListNode *head) { : : ListNode **lpp = &head; : int currValue = INT_MAX; : while (*lpp) { : if ((*lpp)->val == currValue) {
|