代码随想录算法训练营第3天| 203.移除链表元素、 707.设计链表 、206.反转链表 。

203.移除链表元素

Leetcode链接: link

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode dummyhead = new ListNode(0,head);
        ListNode previous = dummyhead;
        ListNode temp = dummyhead.next;
        while(temp != null){
            if(temp.val == val){
                temp = temp.next;
                previous.next = temp;
            }else{
                previous = temp;
                temp = temp.next;
            }
        }
        return dummyhead.next;
    }
}

Linked List作为我学的第一个数据结构,我对此还是了解的比较深刻。这一题是十分基础的一个题目,只花费10分钟就完成了。
我先是在head前面加了个假的head。这样就可以使用两个指针一个是previous,一个temp。previous在前,temp在后,previous主要是用来连接下一个node的,temp则是用来检测temp.val是不是需要删除。最后返回dummyhead.next。以为我们dummyhead是个假的head。dummyhead连接的才是真的head。

707.设计链表

// class ListNode {
//     int val;
//     ListNode next;
//     ListNode(){}
//     ListNode(int val) {
//         this.val=val;
//     }
// }

class MyLinkedList {
    int size;
    ListNode head;

    public MyLinkedList() {
        size = 0;
        head = null;
    }
    
    public int get(int index) {
        if(index >= size){
            return -1;
        }else{
            ListNode temp = head;
            for(int i = 0; i < index; i ++){
                temp = temp.next;
            }
            return temp.val;
        }
    }
    
    public void addAtHead(int val) {
        ListNode temp = new ListNode(val);
        temp.next = this.head;
        this.head = temp;
        size++;
    }
    
    public void addAtTail(int val) {
        if(size == 0){
            head = new ListNode(val);
        }
        ListNode temp = head;
        for(int i = 0; i < size-1; i ++){
            temp = temp.next;
        }
        temp.next = new ListNode(val);
        size++;
    }
    
    public void addAtIndex(int index, int val) {
        if(index > size || index < 0){
            return;
        }else if(index == 0){
            addAtHead(val);
        }else if(index == size){
            addAtTail(val);
        }else{
            ListNode temp = head;
            for(int i = 0; i < index-1; i ++){
                temp = temp.next;
            }
            ListNode tempNext = temp.next;
            temp.next = new ListNode(val);
            temp.next.next = tempNext;
            size++;
        }
    }
    
    public void deleteAtIndex(int index) {
        if(index >= size || index < 0){
            return;
        }else {
            ListNode dummyhead = new ListNode(0);
            dummyhead.next = head;
            ListNode temp = dummyhead;
            for(int i = 0; i < index; i ++){
                temp = temp.next;
            }
            temp.next = temp.next.next;
            head = dummyhead.next;
            size--;
        }
    }
}

这一题也是很基础的一题,只要对linklist足够了解就知道该知道怎么做这题,唯一遇到比较麻烦的地方是如果准备判断指针在for循环中是否落在了自己想要的位置。

206.反转链表

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        ListNode node1 = null;
        ListNode node2 = head;
        ListNode temp = node2.next;
        while(node2 != null){
            node2.next = node1;
            node1 = node2;
            node2 = temp;
            if(node2 != null){
                temp = node2.next;
            }
        }
        return node1;
    }
}

这题去年做过,今年再做也没花费多久的时间。主要是需要使用三个LinkList的指针, 如同下面这个linkedlist

node1 -> node2 -> temp -> null

在每个loop中我们需要把node1和node2的指针调转即可,这里说一下为什么需要temp,这是我们旋转之后的样子。

node1 <- node2 -- temp -> null

由于node2.next指向了node1,使得原本指向temp位置的没了。那我们就无法找到temp。所以需要一个temp来先保存一下。

总结

LinkedList是我最熟悉的一部分。对我来说属于是熟悉代码纯复习。前前后后还是花费了一小时才写出来,debug还是花费了大量的时间。

记录一下自己的学习时长:

leetcode+博客:1h

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值