问题描述
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
解法
解法思想
此题删除链表中元素是很简单的,只需要让待删节点之前一个节点指向待删节点之后一个节点即可。
这里我们讨论两种解法。
在java中定义单链表的代码如下:
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) {this.val = val; }
ListNode(int val, ListNode next) {this.val = val; this.next = next; }
}
解法一
直接适用原来的链表来进行删除操作,这里存在一个问题,移除头节点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。所以头结点如何移除呢,其实只要将头节点向后移动一位就可以,这样就从链表中移除了一个头节点。
class Solution {
public ListNode removeElements(ListNode head, int val) {
//这个是不设置虚拟头节点的解法,要删除的元素需要讨论是不是头节点
//删除头节点
while (head != null && head.val == val) { //注意这里不是if,因为有可能出现前好几个都是val的情况 要是if只能删除一个
head = head.next;
}
//删除非头节点
ListNode cur = head; //遍历节点,初始值为头节点
while (cur != null && cur.next != null) { //后边这个条件是保证cur.next.next有意义
if (cur.next.val == val) {
cur.next = cur.next.next;
}
else {
cur = cur.next;
}
}
return head;
}
}
解法二
解法一中的删除节点对不同的删除节点有不同的操作,可不可以以一种统一的逻辑来移除链表的节点呢?
我们可以***设置一个虚拟头节点dummyHead***,这样原链表的所有节点就都可以按照统一的方式进行移除了。
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummyHead = new ListNode(0); //设置一个虚拟头节点
dummyHead.next = head;
ListNode prev = dummyHead; //遍历节点的上一个节点,初始值为虚拟头节点
ListNode curr = head; //当前的遍历节点,初始值为头节点
while (curr != null) {
if (curr.val == val) {
prev.next = curr.next;
}
else{
prev = curr;
}
curr = curr.next;
}
return dummyHead.next; //不返回head的原因是有可能删除掉了初始的head
}
}
本文介绍了一种从链表中删除所有等于给定值节点的方法。提供了两种解法,一是直接修改原链表,二是引入虚拟头节点简化流程。
1104

被折叠的 条评论
为什么被折叠?



