力扣203(java&python)-移除链表元素(简单)

题目:

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

示例1:

输入: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, 104] 内
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-linked-list-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

添加一个虚拟头结点,并把虚拟头结点的下一个结点指向原始的头结点,在当前结点后还有结点的情况下,遍历并删除val的结点,最后返回虚拟头结点的下一个结点即可。

具体的遍历删除方法为:

  • 定义一个虚拟结点,并指向原链表的头结点;
  • 定义当前结点cur并初始化为虚拟头结点;
  • 当前结点后还有结点时,进行遍历,当当前结点的下一个结点是待删除的结点时,就将当前节点指向它下一结点的下一结点(删除当前结点的下一结点),否则右移当前结点到当前结点的下一结点;
  • 最后返回虚拟结点的下一个结点即可。

注意:

1.cur.next.val == val,而不是cur.next = val?

val表示的是一个值,cur.next表示的是cur的下一个结点的地址,而cur.next.val 表示的是下一个结点的值,题目要求的是删除链表中给定值的结点,应该是值与值进行比较,而不应该是结点地址与值进行比较。

2.最后返回的是 dummyHead.next,而不是cur.next?

最开始将虚拟结点dummyHead赋值给cur,但是后续遍历过程中cur一直在移动,导致最后遍历完链表时,cur指向的是链表末尾的那个结点,而dummyHead没有移动。

java代码:

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode() {}
 7  *     ListNode(int val) { this.val = val; }
 8  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 9  * }
10  */
11 class Solution {
12     public ListNode removeElements(ListNode head, int val) {
13         //定义一个虚拟结点,并指向原链表的头结点
14         ListNode dummyHead = new ListNode(0, head);
15         //定义当前结点cur并初始化为虚拟头结点
16         ListNode cur = dummyHead;
17         //当前结点后还有结点
18         while(cur.next != null){
19             //当前结点的下一个结点是待删除的结点
20             if(cur.next.val == val){
21                 //将当前节点指向它下一结点的下一结点(删除当前结点的下一结点)
22                 cur.next = cur.next.next;
23             }else{
24                 //右移当前结点到当前结点的下一结点
25                 cur = cur.next;
26             }
27         }
28         //返回头结点是虚拟节点的下一个
29         return dummyHead.next;
30     }
31 }

 Python3:

 1 # Definition for singly-linked list.
 2 # class ListNode:
 3 #     def __init__(self, val=0, next=None):
 4 #         self.val = val
 5 #         self.next = next
 6 class Solution:
 7     def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
 8         dummyHead = ListNode(0, head)
 9         cur = dummyHead
10         while cur.next:
11             if cur.next.val == val:
12                 cur.next = cur.next.next
13             else:
14                 cur = cur.next
15         return dummyHead.next

 小知识:

初始化链表:

①初始化一个空节点,初始赋值为0,指针指向为list;

ListNode list = new ListNode(0);

②初始化一个空节点,初始赋值为0,并且list的下一个next指针指向head,指针指向为list;(通常定义一个空节点还需要有节点的next指针指向,否则只是定义一个空节点)

ListNode list = new ListNode(0,head);
或者
ListNode list = new ListNode(0);
list.next=head;

③定义一个空链表

ListNode list=null;
posted on 2022-09-12 15:40  我不想一直当菜鸟  阅读(100)  评论(0编辑  收藏  举报