1. 题目分析
其实链表删除元素这种算法可以说是很熟练了,但是在这里有一个思想很重要,就是头节点的思想。
- 基本思想:
- 我们只需要遍历这个链表,把对应的元素删除就行了,但是当要删除的是头节点的时候,情况就变得比较复杂了。
- 这个时候我们就在函数中添加一个空节点,让这个空节点的next指向head节点,这样每一次删除都不会是头节点的删除了。
- 给出图解
2. 代码实现
2.1. Python代码
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def removeElements(self, head, val):
"""
:type head: ListNode
:type val: int
:rtype: ListNode
"""
if not head:
return None
cur = ListNode(0)
cur.next = head
new_head = cur
while cur.next != None:
if cur.next.val == val:
cur.next = cur.next.next
else:
cur = cur.next
if cur == None:
break
return new_head.next
2.2. Java代码
/**
* Definition for singly-linked list.
* 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) {
ListNode list = new ListNode(0);
list.next = head;
ListNode new_head = list;
if(head == null){
return head;
}
while(list.next != null){
if(list.next.val == val){
list.next = list.next.next;
}else{
list = list.next;
}
}
return new_head.next;
}
}