代码随想录算法刷题训练营

发布时间:2024年01月15日

代码随想录算法训练营day04:Leetcode(203)移除链表元素 、LeetCode(707)设计链表 、LeetCode(206)反转链表修改版

Leetcode(203)移除链表元素

class Solution {
    public ListNode removeElements(ListNode head, int val) {
    ListNode tempHead=new ListNode(1,head);
    ListNode current=tempHead;
    while (current!=null) {
        while(current.next!=null&&current.next.val==val){
            current.next=current.next.next;     
        }
        current=current.next;    
    }
    return tempHead.next;
}
}

**LeetCode(707)设计链表

class ListNode {
    int val;
    ListNode next;
    ListNode(){}
    ListNode(int val) {
        this.val=val;
    }
}
class MyLinkedList {
    //size存储链表元素的个数
    int size;
    //虚拟头结点
    ListNode head;

    //初始化链表
    public MyLinkedList() {
        size = 0;
        head = new ListNode(0);
    }

    //获取第index个节点的数值,注意index是从0开始的,第0个节点就是头结点
    public int get(int index) {
        if(index<0||index>=size){
            return -1;
        }
        ListNode currentNode=head;
        for (int i = 0; i <index+1; i++) {
            currentNode=currentNode.next;    
        }
        return currentNode.val;
    }

    //在链表最前面插入一个节点,等价于在第0个元素前添加
    public void addAtHead(int val) {
        addAtIndex(0, val);
    }

    //在链表的最后插入一个节点,等价于在(末尾+1)个元素前添加
    public void addAtTail(int val) {
        addAtIndex(size, val);
        
    }

    // 在第 index 个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
    // 如果 index 等于链表的长度,则说明是新插入的节点为链表的尾结点
    // 如果 index 大于链表的长度,则返回空
    public void addAtIndex(int index, int val) {
        //判断插入位置是否合适
        if(index>size)
        {
            return;
        }
        if(index<0)
        {
            index=0;
        }
        size++;
        ListNode currListNode=head;
        for (int i = 0; i < index; i++) {
            currListNode=currListNode.next;
        }
        ListNode addNode=new ListNode(val);
        addNode.next=currListNode.next;
        currListNode.next=addNode;//按这个顺序,减少命名一个新变量空间
        
    }

    //删除第index个节点
    public void deleteAtIndex(int index) {
       //删除节点,首先进行判断一下
       if(index<0||index>=size){
             return;
       }
       ListNode deleListNode=head;
       if(index==0){
           head=head.next;
           return;//涉及到头节点要单独拿出来考虑
       }
       for (int i = 0; i < index; i++) {
        deleListNode=deleListNode.next;  
       }
       deleListNode.next=deleListNode.next.next;
    }
}

LeetCode(206)反转链表**

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;//因为cur.next一直再变化,所以需要一个temp作为存储用
        }
        return pre;

    }
}
文章来源:https://blog.csdn.net/m0_46478505/article/details/135578026
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。