链表
链表跟数组关系密切,首先你要理解数组是一块连续的内存地址,把数据放进去。但是他有个不好就是不适合去做增删改查,进行移除或增加操作时,往往非常繁琐,相当于要改变整个数组,因此呢!链表就应用而生,给在存放每一个数据,同时给这个数据指向它后一个数据(链表分为指针域和数据域),且不在是储存在一块连续的内存中,而是散乱分布的这样就为增删改查,提供了很大的便利性,删除数据只需要把指针跳过要删除的那位直接指向下一位(c++需要手动释放不然就是野指针,危害程序安全),操作就算是完成了。因此采用链表这种方式可以很好的适用于数据量不固定,频繁增删改查,较少查询的场景。
B站10分钟讲明白yyds [https://www.bilibili.com/video/BV1S64y1W7u5/?spm_id_from=333.880]
移除链表中的元素:
题意:删除链表中等于给定值 val 的所有节点。
示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2: 输入:head = [], val = 1 输出:[]
示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]
这道题的思路呢其实并不复杂,就是用指针链表去循环,去除给定的val值。同时要考虑一种特殊情况就是当第一个链表数据等于val时,按照一般循环逻辑就是当链表数据等于val时,找到当前元素的前一个元素的指针,将其指向当前链表元素的后一个。如此就实现了链表元素的删除,但当要删除的链表元素为val时,找不到第一个元素的前一个元素,因此删除无法实现。为此,我们引入一种特别的方式,在第一个链表元素的前面再加一个虚拟表头,以此来实现第一个元素的删除,这个虚拟表头不含任何真实数据,只充当一个占位符。思路上就是这么多,但写起来感觉还是很困难的,可能是第一次接触链表吧!
var removeElements = function(head, val) {
const ret = new ListNode(0,head);
let cur = ret;
while(cur.next){
if(cur.next.val === val){
cur.next = cur.next.next;
continue;
}
cur = cur.next;
}
return ret.next;
};
标签:head,cur,val,元素,next,链表,算法,数据结构
From: https://blog.51cto.com/Siri/6944203