代码随想录刷题-day3

42 阅读2分钟

203.移除链表元素

  • 本题可以参考我的另一篇博客Java数据结构——链表
  • 反正对于单向链表的插入 或者是 删除 操作的话,一定要谨记,一定要设置一个pre结点,用来指向我当前结点的上一个结点。

以下是两种不同的代码实现方式:

具体代码实现:

1、使用实际的头结点
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public ListNode removeElements(ListNode head, int val) {
            if(head==null)
                return head;
            ListNode pre=head;
            ListNode temp=pre.next;
            //因为在上面已经把头结点为空的情况额外判断了
            //所以这里头结点一定不为空,temp就从head.next开始(这里要记住还没判断head.val是否等于val)
            while(temp!=null){
                if(temp.val==val){
                    pre.next=temp.next;
                    temp=pre.next;
                }
                else{
                    pre=pre.next;
                    temp=temp.next;
                }
            }
            //因为循环中并没有判断head.val是否等于val 所以循环结束的时候要额外判断一下
            if(head.val==val){
                head=head.next;
            }
            return head;
        }
    }
2、使用虚拟头结点
/**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public ListNode removeElements(ListNode head, int val) {
            //创建一个虚拟头结点,并将其next指向head.
            ListNode fakeHead=new ListNode();
            fakeHead.next=head;
            //正是因为使用了虚拟头结点,所以pre能够从fakehead开始,temp可以直接从head开始判断
            ListNode pre=fakeHead;
            ListNode temp=pre.next;
            while(temp!=null){
                if(temp.val==val){
                    pre.next=temp.next;
                    temp=pre.next;
                }
                else{
                    pre=pre.next;
                    temp=pre.next;
                }
            }
            head=fakeHead.next;
            return head;
        }

    }

707.设计链表

由于在Java数据结构——链表 中已经涉及到单链表的设计,故而这里不再赘述。

206.反转链表

QQ图片20240126201954.jpg


    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public ListNode reverseList(ListNode head) {
            if(head==null){
                return head;
            }
            //个人将虚拟头结点贯彻到底
            //创建一个虚拟头结点指向原链表的head
            ListNode fakeHead=new ListNode();
            fakeHead.next=head;
            //temp结点就是我每次要判断的结点
            ListNode temp=fakeHead.next;
            //resultFakeHead是我结果链表的虚拟头结点
            ListNode resuleFakeHead=new ListNode();
            while(temp!=null){
                //原链表先断
                fakeHead.next=temp.next;
                //resultFakeHead那边的链表接上
               temp.next=resuleFakeHead.next;
               resuleFakeHead.next=temp;
                //然后temp又回归原链表
                temp=fakeHead.next;
            }
            return resuleFakeHead.next;
        }
    }