文档章节

203. Remove Linked List Elements

cofama
 cofama
发布于 2017/02/23 23:02
字数 698
阅读 7
收藏 0

 原题链接https://leetcode.com/problems/remove-linked-list-elements/?tab=Description

Remove all elements from a linked list of integers that have value val.

Example
Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
Return: 1 --> 2 --> 3 --> 4 --> 5

       这题考的是链表操作,毫无疑问要用指针遍历链表的每一个元素。removeElements函数头中给出的参数head应该是指向链表首元素的指针,那么就可以采用head=head->next的方法移动指针遍历。这样我就有两种思路:一,用一个指针nextNode指向当前项的下一项,判断nextNode->val是否等于val,是的话就“跳过”这一项,即把当前元素的next指针改为指向下下个元素。二,新建一个lastNode指针作为“伪首元素”,它的next指向真正的链表首元素(也是head初始指向的地方),判断head->val是否等于val,是的话就“跳过”head指向的当前项,把lastNode的next指向当前项的下一项,不是的话就要用lastNode=lastNode->next移动指针,确保lastNode永远指向当前项的前一项。经过思考我决定采用第二种方法,因为第一种有一个问题,就是用nextNode的话无法判断首元素是否等于val,而且当链表只有一个元素时会出现问题。C++代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* lastNode = new ListNode(0);
        lastNode->next = head;
        ListNode* first = lastNode;
        while(head != NULL) {
        	if(head->val == val) {	
        		lastNode->next = head->next;
			}
			else lastNode = lastNode->next;
			head = head->next;
		}
		//delete lastNode;
        //lastNode = NULL;
		first = first->next;
		return first;
    }
};

      创建lastNode指针时使用的参数0没有特殊意义,只是为了满足构造函数。first指针用于保存伪首元素,因为lastNode后面是会移动的,函数最后返回的是伪首元素的next指针,也就是指向首元素。这段代码里有一句注释掉的delete语句,我原本是想释放lastNode使用的内存空间,但是会报一个runtime error:double free and corruption,double free的意思是重复释放内存。而且经过测试发现,是因为执行了lastNode=lastNode->next才导致error。这篇博文http://blog.csdn.net/hazir/article/details/21413833有介绍delete的作用是释放指针指向的对象使用的内存,但指针本身的内存不会释放,也就是说我的这个delete语句其实是释放了链表中的一个listNode元素,所以这个做法本身是有问题的,但我还是没看出来哪里有“重复释放内存”,因为我应该只用了一次delete(http://www.cnblogs.com/laipDIDI/articles/2173532.html有介绍几种不正确delete导致的错误)。哪位大神路过的话帮忙解答一下。

© 著作权归作者所有

共有 人打赏支持
cofama
粉丝 0
博文 24
码字总数 19162
作品 0
广州
程序员
私信 提问

暂无文章

Cookie 显示用户上次访问的时间

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.serv......

gwl_
今天
1
0
网络编程

第14天 网络编程 今日内容介绍  网络通信协议  UDP通信  TCP通信 今日学习目标  能够辨别UDP和TCP协议特点  能够说出UDP协议下两个常用类名称  能够说出TCP协议下两个常用类名称...

stars永恒
今天
1
0
二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
3
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
2
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部