题目描述:删除链表中等于给定值 val 的所有节点。示例:
- 输入: 1->2->6->3->4->5->6, val = 6
- 输出: 1->2->3->4->5
思路:定义一个新的链表指向 null ,从头开始遍历给定链表,若该节点的数据不是 val ,则尾插到新链表,否则将该结点的下一个结点尾插到新链表。如果该链表为空,则直接返回空。还需要思考的是如果第一个结点的数据就是 val 该如何处置。有三种处理方法:
1.先进行判断,若等于 val ,则让 head 指向它的下一个结点继续判断。
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode prev = null;
ListNode cur = head;
while(cur != null){
if(cur.val == val){
if(cur == head){
head = head.next;
}else{
prev.next = cur.next;
}
}else{
prev = cur;
}
cur = cur.next;
}
return head;
}
}
2.先不管第一个结点的数据,将结点处理完后判断第一个结点,若结点的值为 val ,返回该结点的下一个结点的引用。
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null){
return null;
}
ListNode prev = head;
ListNode cur = head.next;
while(cur != null){
if(cur.val == val){
prev.next = cur.next;
}else{
prev = cur;
}
cur = cur.next;
}
if(head.val == val){
return head.next;
}
return head;
}
}
3.强行给链表的第一个结点找一个前驱,最后返回前驱的下一个结点
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode tmpHead = new ListNode(-1);
tmpHead.next = head;
ListNode prev = tmpHead;
ListNode cur = head;
while(cur != null){
if(cur.val == val){
prev.next = cur.next;
}else{
prev = cur;
}
cur = cur.next;
}
return tmpHead.next;
}
}