Bootstrap

代码随想录刷题day03|链表理论基础&移除链表元素&设计链表&翻转链表


day03学习内容

day03主要内容

  • 链表理论基础
  • 移除链表元素
  • 设计链表
  • 翻转链表

一、 移除链表元素

203原题链接

1.错误写法1

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode dummy = new ListNode(-1,head);
        if(head == null){
            return head;
        }

        ListNode cur = head;
        while(cur.next!=null){
            if(cur.next.val==val){
                cur.next = cur.next.next;
            }else {
                cur = cur.next;
            }
        }
        return dummy.next;
    }
}

为啥不能这么写呢。假设链表是5->7->2->null,需要删除5,声明ListNode cur = head,cur指向5这个元素,在while循环里面(每次循环都是cur.next)就会把第一个节点给跳过,会导致符合条件的节点没有被删除,所以不能这么写。

2.错误写法2

总结起来就是依托答辩,既不像单指针又不像双指针,不知道怎么形容了。。

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if (head == null) {
            return head;
        }

        ListNode dummy = new ListNode(-1, head);
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == val) {
                dummy.next = cur.next;
            } else {
                dummy = cur;
            }
            cur = cur.next;
        }
        return dummy.next;
    }
}

用脑袋想想,肯定不能移动dummy的指向,一直移动dummy,最后返回null了。如下图,入参head=1->2->3->null
如图

2.正确写法1

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode dummy = new ListNode(-1,head);
        if(head == null){
            return head;
        }

        ListNode cur = dummy;
        while(cur.next!=null){
            if(cur.next.val==val){
                cur.next = cur.next.next;
            }else {
                cur = cur.next;
            }
        }
        return dummy.next;
    }
}

2.正确写法2

`采用双指针

class Solution {
    public static 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) {
            if (cur.val == val) {
                prev.next = cur.next;
            } else {
                prev = cur;
            }
            cur = cur.next;
        }
        return dummy.next;
    }
}

二、设计链表

209原题链接

答案略

三、翻转链表

206原题链接

1.错误写法1

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null){
            return null;
        }
        ListNode newList = new ListNode(-1);
        ListNode prev =  newList;
        ListNode cur = head;
        while(cur!=null){
            ListNode temp = cur.next;
            cur.next = prev;
            prev = cur;//为什么要先移动prev指针,建议画图跑一下就明白了
            cur = temp;
        }
        return prev;
    }
}

这样为什么是错的呢,很明显,构造了一个非空的虚拟头结点,假如入参head=[1,2,3,4,5],最后会输出[5,4,3,2,1,-1],会把-1也给带出来。


1.正确写法1-双指针

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null){
            return null;
        }
        ListNode newList = null;
        ListNode prev =  newList;
        ListNode cur = head;
        while(cur!=null){
            ListNode temp = cur.next;
            cur.next = prev;
            prev = cur;
            cur = temp;
        }
        return prev;
    }
}

总结

1.题目比较简单,但是错的不少,菜就多练吧

2.思维导图

;