您现在的位置是:首页 >技术杂谈 >代码随想录算法训练营第三天|203.移除链表元素、707.设计链表、206.反转链表网站首页技术杂谈

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

weixin_42474696 2023-06-01 04:00:02
简介代码随想录算法训练营第三天|203.移除链表元素、707.设计链表、206.反转链表


一、203.移除链表元素

  • 自己看到题目的第一想法

链表类型的题,一定要注意设置两样东西:1)设置虚拟头结点,2)一个指针cur

  • 看完题解之后的想法

  • 自己实现过程中遇到的问题总结

  1. ListNode dummyhead = new ListNode();默认是生成一个val是0,next是null的节点
  2. cur指针移动条件(这个错好几回了!):当值相等的时候,移除元素;当值不相等时,cur指针再去向前移动。而不是每次循环都移动cur指针。
public class n203 {
    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(6);
        ListNode listNode4 = new ListNode(3);
        ListNode listNode5 = new ListNode(4);
        ListNode listNode6 = new ListNode(5);
        ListNode listNode7 = new ListNode(6);
        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode4;
        listNode4.next = listNode5;
        listNode5.next = listNode6;
        listNode6.next = listNode7;

        removeElements(listNode1,6);
    }
    public static ListNode removeElements(ListNode head, int val) {
        ListNode dummyhead = new ListNode();//?
        dummyhead.next = head;
        ListNode cur = dummyhead;
        while(cur.next!=null){
            if(cur.next.val==val){
                cur.next = cur.next.next;
            } else {
                cur = cur.next;
            }
        }
        return dummyhead.next;
    }
}
 class ListNode{
     int val;
     ListNode next;
     ListNode(){}
     ListNode(int val){this.val = val;}

 }

17分钟

二、707.设计链表

  • 自己看到题目的第一想法

  • 看完题解之后的想法

  • 自己实现过程中遇到的问题总结

  1. get和remove的时候索引不能等于size,所以 if (index>=size){
  2. add的时候索引可以等于size,所以 if (index>size||size<0){
class MyLinkedList {
    int size;
    ListNode dummyhead;
    public MyLinkedList() {
        size = 0;
        dummyhead = new ListNode();
    }
    
    public int get(int index) {
        ListNode cur = dummyhead;
        if (index>=size){
            return -1;
        }
        for(int i = 0;i<index+1;i++){
            cur = cur.next;
        }
        return cur.val;
    }
    
    public void addAtHead(int val) {
        ListNode cur = dummyhead;
        
        // ListNode temp = cur.next;
        ListNode l1 = new ListNode(val);
        l1.next = cur.next;
        cur.next = l1;

        size++;//!!
    }
    
    public void addAtTail(int val) {
        ListNode cur = dummyhead;
        while(cur.next!=null){
            cur = cur.next;
        }
        cur.next = new ListNode(val);
        size++;

    }
    
    public void addAtIndex(int index, int val) {
        ListNode cur = dummyhead;
        if (index>size||size<0){
            return;
        }
        for(int i =0;i<index;i++){
            cur = cur.next;
        }
        ListNode l1 = new ListNode(val);
        l1.next = cur.next;
        cur.next = l1;

        size++;
    }
    
    public void deleteAtIndex(int index) {
        ListNode cur = dummyhead;
        if (index>=size||size<0){
            return;
        }
        for(int i =0;i<index;i++){
            cur = cur.next;
        }
        cur.next = cur.next.next;
        size--;

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

26分钟

三、206.反转链表

  • 自己看到题目的第一想法
  1. 使用pre,cur,temp三个指针
  2. 更新prev、cur位置时要注意
  • 看完题解之后的想法

  • 自己实现过程中遇到的问题总结

    public ListNode reverseList(ListNode head) {
        // ListNode dummyhead = new ListNode();
        // dummyhead.next = head;
        ListNode pre = null;
        ListNode cur = head;
        while(cur!=null){
            ListNode temp = cur.next;
            cur.next = pre;

            //变到下一个
            pre = cur;
            cur = temp;
        }
        return pre;
    }

22分钟


四、27.移除元素

  • 自己看到题目的第一想法

  • 看完题解之后的想法

  • 自己实现过程中遇到的问题总结

总结

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。