LeetCode 203 Remove Linked List Elements(移除链表元素)(Linked List)(*)

简介: 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50598373 翻译从一个链表中移除所有值为val的元素。
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50598373

翻译

从一个链表中移除所有值为val的元素。

例如
给定:1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
返回:1 --> 2 --> 3 --> 4 --> 5

原文

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

分析

昨天中午收到一个好消息于是许久不能平静,反反复复这题一直错误,越改越混乱,毕竟逻辑已经在九霄云外了……

卧槽,这博客写的,啥好消息啊!我自己都好奇了……(2016/08/13更新)

今早删了昨天的代码重新来过,一次通过。

我新设置了3个索引:

newHead,指向头部,用于最后返回
pre,指向移动中节点的前一个节点
cur,指向移动中的节点

我就不画图了……通过cur的不断循环,while内部判断cur的值是否与给定的val相等,分别作相应操作。最后pre和cur都移动到链表后面了,返回整个链表的重任就交给了newHead了。

还有一个关键问题是,上面的方法是从链表第二个节点开始与val作比较,那么第一个节点呢?昨天的思路现在想想真是太繁琐了,昨天是用了两个while循环,第二个就是上文说到,第一个用于判断链表头部的元素是否和val相等。

但是更好的方法是直接使用newHead。之前不是对链表第二个元素到最后一个元素做了判断嘛,返回的时候直接返回newHead或newHead的下一个元素不就好了?

代码

/**
* 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;;
    }
};

分析2

updated at 2016/08/13

其实几个月过去后,就发现原来的办法太复杂了,相比于现在的解法不仅多使用了一个变量,还多了2个if语句。

不过整体思路是一样的,只不过这里使用了新的head,就不会担心无法删除原本head的第一个节点了。

代码2

/**                                                                                                                                                                                            
 * 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 == NULL) return head;
    ListNode *newHead = new ListNode(0), *prev = newHead;
    newHead->next = head;
    while (prev && prev->next) {
      if (prev->next->val == val) {
        prev->next = prev->next->next;
      } else {
        prev = prev->next;
      }
    }
    return newHead->next;
  }
};
目录
相关文章
|
4月前
|
索引
【Qt 学习笔记】Qt常用控件 | 多元素控件 | List Widget的说明及介绍
【Qt 学习笔记】Qt常用控件 | 多元素控件 | List Widget的说明及介绍
507 3
|
6月前
|
存储 NoSQL 安全
Redis第六弹-List列表-(相当于数组/顺序表)Lpush key element-一次可以插入多个元素(假如key已经存在,并且key对应的value并非是list,则会报错)
Redis第六弹-List列表-(相当于数组/顺序表)Lpush key element-一次可以插入多个元素(假如key已经存在,并且key对应的value并非是list,则会报错)
|
5月前
|
NoSQL Java Redis
Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
|
6月前
|
Java 索引
Java List实战:手把手教你玩转ArrayList和LinkedList
【6月更文挑战第17天】在Java中,ArrayList和LinkedList是List接口的实现,分别基于动态数组和双向链表。ArrayList适合索引访问,提供快速读取,而LinkedList擅长插入和删除操作。通过示例展示了两者的基本用法,如添加、访问、修改和删除元素。根据场景选择合适的实现能优化性能。
56 0
|
6月前
|
Java 开发者 索引
Java List全攻略:从ArrayList到LinkedList,一网打尽!
【6月更文挑战第17天】Java List详解:ArrayList依赖动态数组,擅长随机访问和遍历,适合少次插入删除;LinkedList基于双向链表,插入删除高效,尤其在头尾操作,但随机访问慢。选择取决于应用场景,理解特性以优化代码。探索ArrayList与LinkedList,提升编程效率!
79 0
|
6月前
|
Java 索引
那些年,我们追过的Java List——ArrayList与LinkedList的爱恨情仇
【6月更文挑战第17天】ArrayList与LinkedList,Java List接口的双子星,各有千秋。ArrayList基于数组,随机访问快速,但插入删除慢;LinkedList用链表实现,插入删除高效,但索引访问慢。两者在爱恨情仇中教会我们权衡选择,成为编程旅程中难忘的记忆。 ```
31 0
|
6月前
|
存储 Java C++
Java List大揭秘:ArrayList vs LinkedList,谁才是真正的王者?
【6月更文挑战第17天】ArrayList和LinkedList是Java中实现List接口的两种方式。ArrayList基于动态数组,适合随机访问和遍历,内存紧凑,但插入删除元素特别是在中间时效率低。LinkedList以双向链表实现,擅长任意位置的插入删除,内存管理灵活,迭代高效,但随机访问性能差。选择使用哪种取决于具体应用场景。
41 0
|
6月前
|
Java
JavaSE——集合框架一(4/7)-List系列集合:LinkedList集合的底层原理、特有方法、队列、栈
JavaSE——集合框架一(4/7)-List系列集合:LinkedList集合的底层原理、特有方法、队列、栈
51 0
|
6月前
|
存储 NoSQL Redis
Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding
Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding
|
7月前
|
Java API
【亮剑】三种有效的方法来删除List中的重复元素Java的List
【4月更文挑战第30天】本文介绍了三种Java中删除List重复元素的方法:1) 使用HashSet,借助其不允许重复值的特性;2) 利用Java 8 Stream API的distinct()方法;3) 对自定义对象重写equals()和hashCode()。每种方法都附带了代码示例,帮助理解和应用。
225 1