代码随想录算法第三集203移除链表元素

第三天刷题记录

  • 203.移除链表元素

题目

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

题解

删除链表元素的核心在于将next节点指向下下个节点,也就是
cur = cur.next
解法1.虚拟头指针
为了方便删除头节点,新增一个虚拟的头元素,然后从头遍历元素

    public ListNode removeElements(ListNode head, int val) {
         if(head == null){
             return head;
         }
         //新建一个虚拟元素
         ListNode dummy = new ListNode(-1,head);
         ListNode prev = dummy;
         ListNode cur = head;
         while(cur != null){
         //找到相同元素,prev.next指针跳过cur,也就是删除了cur
             if(cur.val==val){
                 prev.next = cur.next;
             }else{
             //没找到相同元素,prev向前移一位
                 prev = cur;
             }
             //每次cur都向前移一位
             cur = cur.next;
         }
         //返回头节点
         return dummy.next;
    }
}

解法2. 不需要虚拟头元素
需要提前判断head元素是否相等

class Solution {
    public ListNode removeElements(ListNode head, int val) {
      // 注意是while,如果有多个相同的元素,直接往下走
         while(head!= null && head.val == val){
             head = head.next;
         }
         if(head == null ){
             return head;
         }
         ListNode prev = head;
         ListNode cur = head.next;
         while(cur != null){
             if(cur.val==val){
                 prev.next = cur.next;
             }else{
                 prev = cur;
             }
             cur = cur.next;
         }
         return head;
    }
}
  • 206.反转链表

题目
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

题解
1.双指针法,一个cur指针,一个prev指针(记录cur的next反转指向位置)

  public ListNode reverseList(ListNode head) {
       //注意,头节点前加一个null节点,然后再双指针向前即可
       ListNode prev = null;
       ListNode cur = head;
       ListNode tmp = null;
       while(cur!=null){
           tmp = cur.next;
           cur.next = prev;
           prev= cur;
           cur = tmp;
       }
       return prev;
    }

2.递归法
每次递归都是更新下一个节点位置

public ListNode reverseList(ListNode head) {
        return reverse(null, head);
    }

    private ListNode reverse(ListNode prev, ListNode cur) {
        if (cur == null) {
            return prev;
        }
        ListNode temp = null;
        temp = cur.next;// 先保存下一个节点
        cur.next = prev;// 反转
        return reverse(cur, temp);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值