刷题笔记-203. 移除链表元素

104 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

一、题目描述:

203. 移除链表元素 - 力扣(LeetCode)

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。  

示例 1:

image.png

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

提示:

  • 列表中的节点数目在范围 [0, 10^4] 内
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

二、思路分析:

  1. 首先判断链表是否为空,为空则直接返回
  2. 循环链表中的所有节点,如果当前节点的val等于val时,则表示需要删除该节点,需要将当前节点的上一节点的next指向当前节点的下一个节点;这样就需要记录当前节点的上一个节点由于单向链表所以新建一个listNode,将listNode.next = head
  3. 定义两个指针 temp 和 temp2;temp=listNode,temp2=listNode.next(其实指向的是head)
  4. 循环链表 判断temp2.val 是否等于val 如果等于则将temp.next指向temp2.next;这样在temp2中就将当前节点删除
  5. 如果 temp2.val不等于val,则temp2 = temp2.next;temp=temp.next;继续下个几点进行比较
  6. 终止条件是 temp2 == null时;

三、AC 代码:

public ListNode removeElements(ListNode head, int val) {
		if(head == null){
			return head;
		}
		ListNode listNode = new ListNode(-1);
		listNode.next = head;
		ListNode temp = listNode;
		ListNode temp2 = temp.next;
		for (;;){
			if (temp2.val == val) {
				temp.next = temp2.next;
				temp2 = temp2.next;
			}else{
				temp2 = temp2.next;
				temp = temp.next;
			}
			if(temp2 == null){
				break;
			}
		}
		return listNode.next;
	}

范文参考:

移除链表元素的两种解法:虚拟头节点与递归 - 移除链表元素 - 力扣(LeetCode)

动画演示 迭代法 #203 移除链表元素 - 移除链表元素 - 力扣(LeetCode)