删除链表中等于给定值 val 的所有节点。
eg:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
第一种方法
①首先给定了一个值。这个时候我们要遍历链表。凡是发现和给定的值相同的都要删除。
②因为是顺序不变,这个时候我们可以重新创建一个空链表。
③定义一个空链表的尾巴。第一个不等于val的值作为空链表的头,再进行尾插。而下一个不等于val的值在进行尾插。把尾巴赋给当前的结点。依次进行尾插。
④尾插进行完之后,返回新的链表,就是删除val之后的链表。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
//新的链表,记录删除后的所有数据
ListNode result = null;
//对结果进行尾插,定义一个最后结点
ListNode last = null;
//遍历原链表
ListNode cur = head;
while (cur != null) {
//保存原链表的下一个结点
ListNode next = cur.next;
//如果当前的值不是要删除的,就将其尾插到新链表上
if (cur.val != val) {
cur.next = null;
if (result == null) {
result=cur;
} else {
last.next = cur;
}
last = cur;
}
cur = next;
}
return result;
}
}
第二种方法
①首先定义一个cur节点记录当前节点
②判断当前节点的下一个节点是否为val。如果是,则删除。如果不是,节点往下走
③走过所有的节点之后,再判断头节点是否为val。
public ListNode removeElements2(ListNode head, int val) {
if (head == null) {
return null;
}
ListNode cur = head;
while (cur.next != null) {
//如果当前节点的下一个值不是val。则继续判断下下一个
if (cur.next.val != val) {
cur = cur.next;
} else {
//此时如果当前节点的下一个是val。则直接删除,当前的next连接到next的next。
cur.next = cur.next.next;
}
}
if (head.val == val) {
return head.next;
} else {
return head;
}
}
}