代码随想录一刷day03

本文介绍了三种不同的方法来实现力扣203题的移除链表元素,包括添加虚拟节点、不添加虚拟节点以及不带前置指针的情况。接着讨论了力扣707题的设计链表,通过单链表和双链表实现基本操作。最后,讲解了力扣206题的反转链表,给出了头插法、双指针法和递归解法。所有方法都关注于如何高效地操作链表节点。

提示:代码随想录一刷03day


前言

添加虚拟头结点方便操作


一、力扣203移除链表元素

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) {
       ListNode newHead = new ListNode(-1,head);
       ListNode pro = newHead;
       ListNode p = head;
       while(p!=null){
           if(p.val==val){
               p = p.next;
               pro.next = p;
           }else{
               pro.next = p;pro = p;
               p = p.next;
           }
       }
       return newHead.next;
    }
}

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) {
       while(head!=null&&head.val==val){
           head = head.next;
       }
       while(head==null){
           return null;
       }
       ListNode pro = head;
       ListNode p = head.next;
       while(p!=null){
           if(p.val==val){
               p = p.next;
               pro.next = p;
           }else{
               pro.next = p; pro = p;
               p = p.next;
           }
       }
       return head;
    }
}

3.不添加虚拟节点&&不带前置指针

/**
 * 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) {
       while(head!=null&&head.val==val){
           head = head.next;
       }
       while(head==null){
           return null;
       }
       ListNode p = head;
       while(p.next!=null){
           if(p.next.val==val){
               p.next = p.next.next;
           }else{
               p = p.next;
           }
       }
       return head;
    }
}

二、力扣707设计链表

链表的操作,主要还是在于,附加一个头结点,方便操作

1.单链表

class MyLinkedList {
    int size;
    ListNode head;
    
    public MyLinkedList() {
        this.size = 0;
        this.head = new ListNode(0,null);
    }
    
    public int get(int index) {
        if(index >= this.size || index < 0){
            return -1;
        }
        ListNode p = head;
        for(int count = 0; count <= index; count++){
            p = p.next;
        }
        return p.val;
    }
    
    public void addAtHead(int val) {
        ListNode e = new ListNode(val, null);
        e.next = head.next;
        head.next = e;
        this.size++;
    }
    
    public void addAtTail(int val) {
        ListNode p = head;
        for(int count = 0;count<size; count++){
            System.out.println(p.val);
            p = p.next;
        }
        p.next = new ListNode(val, null);
        this.size++;
    }
    
    public void addAtIndex(int index, int val) {
        ListNode p = head;
        if(index >= 0 && index <= size){
            for(int count = 0;count<index;count++){
                p = p.next;
            }
            ListNode e = new ListNode(val,null);
            e.next = p.next;
            p.next = e;
            this.size++;
        }
    }
    
    public void deleteAtIndex(int index) {
        ListNode p = head;
        if(index >= 0 && index < size){
            for(int count = 0;count<index;count++){
                p = p.next;
            }
            p.next = p.next.next;
            this.size--;
        }
    }
}
class ListNode{
    int val;
    ListNode next;
    public ListNode(){}
    public ListNode(int val, ListNode next){
        this.val = val;
        this.next = next;
    }
}

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList obj = new MyLinkedList();
 * int param_1 = obj.get(index);
 * obj.addAtHead(val);
 * obj.addAtTail(val);
 * obj.addAtIndex(index,val);
 * obj.deleteAtIndex(index);
 */

2.双链表

class MyLinkedList {
    int size;
    DListNode head, tail;
    
    public MyLinkedList() {
        this.size = 0;
        this.head = new DListNode(0);
        this.tail = new DListNode(0);
        this.head.next = this.tail;
        this.tail.prev = this.head;
    }
    
    public int get(int index) {
        if(index >= this.size || index < 0){
            return -1;
        }
        DListNode p = head;
        for(int count = 0; count <= index; count++){
            p = p.next;
        }
        return p.val;
    }
    
    public void addAtHead(int val) {
        this.addAtIndex(0,val);
    }
    
    public void addAtTail(int val) {
        this.addAtIndex(this.size, val);
    }
    
    public void addAtIndex(int index, int val) {
        DListNode p = head;
        if(index >= 0 && index <= size){
            for(int count = 0;count<index;count++){
                p = p.next;
            }
            DListNode e = new DListNode(val);
            e.next = p.next;
            p.next.prev = e;
            e.prev = p;
            p.next = e;
            this.size++;
        }
    }
    
    public void deleteAtIndex(int index) {
        DListNode p = head;
        if(index >= 0 && index < size){
            for(int count = 0;count<index;count++){
                p = p.next;
            }
            p.next = p.next.next;
            p.next.prev = p;
            this.size--;
        }
    }
}
class DListNode{
    int val;
    DListNode next, prev;
    public DListNode(){}
    public DListNode(int val){
        this.val = val;
        this.next = null;
        this.prev = null;
    }
}

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList obj = new MyLinkedList();
 * int param_1 = obj.get(index);
 * obj.addAtHead(val);
 * obj.addAtTail(val);
 * obj.addAtIndex(index,val);
 * obj.deleteAtIndex(index);
 */

三、力扣206反转链表

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 reverseList(ListNode head) {
        ListNode newHead = new ListNode(0,null);
        while(head != null){
            ListNode p = head;
            head = head.next;
            p.next = newHead.next;
            newHead.next = p;
        }
        return newHead.next;
    }
}

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 reverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        ListNode temp = null;
        while(cur!=null){
            temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
}

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 reverseList(ListNode head) {
        return reverse(null, head);
    }
    public ListNode reverse(ListNode prev, ListNode cur){
        if(cur==null){
            return prev;
        }
        ListNode temp = null;
        temp = cur.next;
        cur.next = prev;
        return reverse(cur, temp);
    }
}

总结

加上一个虚拟头结点方便操作

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乱世在摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值