LeetCode 203 Remove Linked List Elements(移除链表元素)(*)
2016-01-28 08:58
453 查看
翻译
[code]从一个链表中移除所有值为val的元素。 例如 给定:1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6 返回:1 --> 2 --> 3 --> 4 --> 5
原文
[code]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
分析
昨天中午收到一个好消息于是许久不能平静,反反复复这题一直错误,越改越混乱,毕竟逻辑已经在九霄云外了……今早删了昨天的代码重新来过,一次通过。
我新设置了3个索引:
[code]newHead,指向头部,用于最后返回 pre,指向移动中节点的前一个节点 cur,指向移动中的节点
我就不画图了……通过cur的不断循环,while内部判断cur的值是否与给定的val相等,分别作相应操作。最后pre和cur都移动到链表后面了,返回整个链表的重任就交给了newHead了。
还有一个关键问题是,上面的方法是从链表第二个节点开始与val作比较,那么第一个节点呢?昨天的思路现在想想真是太繁琐了,昨天是用了两个while循环,第二个就是上文说到,第一个用于判断链表头部的元素是否和val相等。
但是更好的方法是直接使用newHead。之前不是对链表第二个元素到最后一个元素做了判断嘛,返回的时候直接返回newHead或newHead的下一个元素不就好了?
代码
[code]/** * 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) { if (!head) return NULL; ListNode *pre = head, *cur = head->next, *newHead = pre; if (!cur) return pre->val == val ? NULL : pre; while (cur) { if (cur->val == val) pre->next = cur->next; else pre = pre->next; cur = cur->next; } if (newHead->val == val) return newHead->next; else return newHead;; } };
相关文章推荐
- Thread-Local Variables线程局部变量
- 人工智能笔记一
- Server.MapPath()使用注意事项
- android wifi状态3种广播
- WEB网站常见的攻击方法总结与原理分析
- 设计模式—适配器模式(Go语言描述)
- javascript实现随机显示星星特效
- 最快速的Android开发环境搭建ADT-Bundle及Hello World
- linux信号总结
- sleep(n)函数实现
- Ubuntu 14.04 文件服务器--samba的安装和配置
- Android开发——利用Systrace工具优化Android App的运行性能
- Win10预览版10586.71怎么升级? 安装累计补丁KB3124262
- 初探android应用性能分析
- 静态成员与非静态成员
- phpcms二次开发
- 3、JavaScript函数
- 课后题--------求分子量-----Molar mass------
- Animation动画详解(七)——ObjectAnimator基本使用
- 实例讲解分布式缓存软件Memcached的Java客户端使用