链表OJ练习
一、链表的删除
【题目】给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。
【分析】
- 需要判断删除节点是否为空
if(head == null){
return null;
}
- 删除头节点
if(head.val == val){
head = head.next;
}
- 删除中间节点
ListNode prev = head; //待删除节点的前一个节点
ListNode cur = head.next; //待删除节点
while(cur != null) {
if(cur.val == val) {
//找到了待删除节点
prev.next = cur.next;
cur = prev.next;
}
else {
//当前值不是需要删除的值,则只需更新 prev 和 cur
prev = prev.next;
cur = cur.next;
}
}
- 注意:此方法忽略了第二个元素也是目标元素的情况,故应该循环判断头结点是否是要删除的节点,为了解决这个问题,最简单的方法是调整删除头结点和删除中间节点的顺序
class ListNode {
int val = 0;
ListNode next = null;
public ListNode() {
}
public ListNode(int val) {
this.val = val;
this.next = null;
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public class Solution {
public ListNode removeElements(ListNode head, int val) {
//在线oj提供的链表默认不带傀儡节点
//删除时需要考虑待删除节点是否是头结点的情况
//删除其他节点是需要找到该节点的前一个节点
//删除头结点为空的节点
if(head == null){
return null;
}
//删除一般节点
ListNode prev = head; //待删除节点的前一个节点
ListNode cur = head.next; //待删除节点
while(cur != null) {
if(cur.val == val) {
//找到了待删除节点
prev.next = cur.next;
cur = prev.next;
}
else {