题目:删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
下面这一版本没有设置虚拟头结点,而是利用了prev指针来找到删除节点的前一个位置,并利用了以下这个逻辑,将重复的节点置空,而不是单纯的跳过去。
delNode代表重复的被删除的节点
prev代表被删除节点的前一个节点
if(prev.next.val == val){
ListNode delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
}else{
prev = prev.next;
}
关键代码:
while(prev.next != null){
if(prev.next.val == val){
ListNode delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
}else{
prev = prev.next;
}
}
完整代码:
/**
* 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) {
while(head != null && head.val == val){
ListNode delNode = head;
head = head.next;
delNode.next = null;
}
if(head == null){
return null;
}
ListNode prev = head;
while(prev.next != null){
if(prev.next.val == val){
ListNode delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
}else{
prev = prev.next;
}
}
return head;
}
}
在下面这一方法中设置了虚拟头结点,更简便一些,方法中没有将要删除的的节点置空,而是选择用prev.next = prev.next.next的方式将其跳过去.
因为只为了解题,所以Loitering Objects暂不考虑.
完整代码:
dummyHead 代表虚拟头结点
prev代表被删除节点的前一个节点
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){
prev.next = prev.next.next;
}else{
prev = prev.next;
}
}
return dummyHead.next;
}
}