「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。
203. 移除链表元素
描述
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == 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
输出:[]
做题
做了这么多道题,我得出一个结论,做链表的题目不要吝啬创建一个新的链表头,这会大大降低题目的难度,如果一直执着于要用原来的链表头去做题,那会纠结于怎么找到合适的链表头。
思路:
这道题比较简单,遍历链表,如果 Node.val == val 就跳过,需要注意的是,当不等于时,把当前节点连接到我们的新的链表上时,要把这个节点的尾巴给切掉,不然当最后一个数我们也要跳过时,就非常难处理。
public ListNode removeElements(ListNode head, int val) {
ListNode result = new ListNode(-1);
ListNode temp = result;
while(head!=null){
if(head.val == val){
head = head.next;
}else{
temp.next = head;
temp = temp.next;
head = head.next;
temp.next = null;
}
}
return result.next;
}
83. 删除排序链表中的重复元素
描述
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例 1:
输入: head = [1,1,2]
输出: [1,2]
示例 2:
输入: head = [1,1,2,3,3]
输出: [1,2,3]
做题
思路:
当我们熟练了链表的套路之后,这些题目做起来就比较简单了。
因为题目已经给我们拍好序了,所以我们遍历时遇到相同值的节点时,直接跳到下一个节点就好了,像 [1,1,2 ] ,直接跳到下一个节点是 2,就可以把当前的节点 1 赋值给 result.next 了。
public ListNode deleteDuplicates(ListNode head) {
ListNode result = new ListNode(-1);
ListNode temp = result;
while(head!=null){
while(head.next!=null && head.val == head.next.val){
//跳过这个节点
head = head.next;
}
temp.next = head;
head = head.next;
temp = temp.next;
}
return result.next;
}
今天就到这里了。
这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。