过了一阵子,调整了自己,这篇博客是过完新年的第一篇博客,生活还要继续,继续奋斗;
今天这道题目其实不难,整道题目围绕的是链表的基础知识,请看题目的描述以及输入输出样例:
题目描述:删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
解题思路:
可以看出这个样例是一个链表,我们只要匹配到节点值为val,并把此节点给删除即可
第一种方法:
1.我们将从head(头节点)开始遍历整个链表,如果头节点的值和val相同,那么就把头节点删除,在删除之前记得把head指向要删除的头节点的下一个节点,作为新的头节点;当然,在此过程中需要判断head是否为null(为null就直接返回null),也可能会出现整个链表中节点的值都和val相等,那么我们在删除头节点的操作外面加一层循环即可;
2.上面的步骤执行完毕后,如果发现此时的head不为空(head为null,证明了整个链表中节点的值都和val相等),也就意味着不是整个链表节点的值都和val相等,那么我们把此时的head作为头节点,从head.next进行遍历(因为此时的head节点的值必不可能和val相等),最后返回head即可
完成上述两个步骤之后即可解出这道题目:参考代码如下(Java):
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
class Solution {
public ListNode removeElements(ListNode head, int val) {
//首先考虑头节点的只是否有和val相等的
while (head != null && head.val == val) {
ListNode delNode = head;
head = head.next;
delNode.next = null;
}
//如果整个链表节点的值都和val相同 则head为null
if (head == null) {
return null;
}
//接下来则从head下一个元素寻找(经过前面的条件筛选,head的值必不可能和val相等)
ListNode prev = head;
while (prev.next != null) {
if (prev.next.val == val) {
ListNode delNode = prev.next;
prev.next = prev.next.next;
delNode.next = null;
} else {
prev = prev.next;
}
}
return head;
}
}
第二种方法:(虚拟头节点意思不明确的可以自行上网搜索知识点)
其实和第一种方法大致相同,但是更加简便明了,第一种方法没有使用虚拟的头节点,这次我们使用虚拟头节点来解出这一道题目
思路:和第一种思路有点区别,拥有了虚拟头节点,我们只要去遍历整个链表,删除掉节点值和val相等的节点即可;
参考代码如下:
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
class Solution {
//使用虚拟头节点
public ListNode removeElements(ListNode head, int val) {
//创建一个虚拟的头节点,里面的值随便赋值即可
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode prev = dummyHead;
while (prev.next != null) {
if (prev.next.val == val) {
ListNode delNode = prev.next;
prev.next = prev.next.next;
delNode.next = null;
} else {
prev = prev.next;
}
}
return dummyHead.next;
}
}
总结一下:此道题目所围绕的知识就是链表的基础知识,第一种方法和第二种方法在于是否使用头节点,更加深一步的学习链表将在以后的博客进行更新,敬请期待!