数据结构:链表,leetcode203题删除链表元素

Posted 没有文化的java菜鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构:链表,leetcode203题删除链表元素相关的知识,希望对你有一定的参考价值。

 链表:真正的动态数据结构。  1最简单的动态数据结构。2也能帮助更深入的理解引用和指针。具有递归结构性质

 

数据存储在Node节点中, E存储元素,Next代表下一个元素节点。最后一个元素为NULL。 就像或者车厢之间链接一样  next负责链接。

优点:就是真正的动态,不需要处理固定容量的问题。

缺点:丧失了随机访问的能力。

对链表的理解:其实就是创建了一个又一个对象然后每个对象都存储着后一位对象;所以它只能往后循环。不能倒着循环。

 

/**
*  链表结构  只能从前往后查。从头节点动态加入。
**/
public class LinkedList<E> {
    
      private   class Node{
        public E  e ;     //本节点存储的数据
        public Node next;   

        public Node(E e, Node next){
            this.e = e;
            this.next = next;
        }

        public Node(E e){
            this(e,null);
        }

        public Node(){
            this(null,null);
        }

        @Override
        public String toString(){
            return e.toString();
        }
    }
    
     private Node dummyHead;    //虚拟头节点
     private int  size;    //链表的长度
     
    
       public LinkedList(){
        dummyHead = new Node(null,null);
        size = 0;
    }
    
    /**    从头节点开始添加 是O(1)   新加入的元素的next 给head   然后再把head指向新加入的元素。即是新加入的成为了新的头节点。
    **/
     public void add(int index,  E e){
        if(index < 0 || index > size)
            throw new IllegalArgumentException("Add failed. Illegal index. ");
            Node prev = dummyHead;
            for(int i = 0; i< index ; i++){
                prev = prev.next;   
            }
            prev.next = new Node(e, prev.next);
            size ++;
    }

       public void addFirst(E e){ add(0,e); }
       public  void addLast(E e){add(size,e);}
       
        public  int getSize(){return size; }

    public boolean isEmpty(){return size == 0;}
    
    
       public E remove (int index){
       if(index < 0 || index >= size)
           throw new IllegalArgumentException("remove failed. Illegal index.");
       Node prev = dummyHead;   
       for(int i = 0; i< index ; i++){
           prev = prev.next;
       }
       Node  delNode = prev.next;
       prev.next  =  delNode.next;
       delNode.next = null;
       size --;
       return delNode.e;
   }

    public E removeFirst (){return remove(0);};
    public E removeLast (){return remove(size-1);};
    
    
    public  E get(int index ){
        if(index < 0 || index >= size)
            throw new IllegalArgumentException("Get failed. Illegal index.");
        Node cur = dummyHead.next;  
            for(int i = 0; i< index ; i++){
            cur = cur.next;
        }
        return cur.e;
    }

    public  E getFirst(){
        return get(0);
    }


    public  E getLast(){
        return get(size -1);
    }
    
      //修改方法
     public void set(int index,E e){
         if(index < 0 || index >= size)
             throw new IllegalArgumentException("Update failed. Illegal index.");
         Node cur = dummyHead.next;   //从1开始
         for(int i = 0; i< index ; i++){
             cur = cur.next;
         }
         cur.e = e ;
     }
     //是否包含方法
    public boolean contains(E e){
            Node cur = dummyHead.next;
            while(cur.next != null){
                 if(cur.equals(e)) return true;
                 cur = cur.next;
            }
            return false;
    }
    
    
    @Override
    public String toString(){
        StringBuilder res = new StringBuilder();
        for(Node cur = dummyHead.next ; cur != null ; cur = cur.next)
            res.append(cur + "->");
        res.append("NULL");
            res.append("NULL");
            return res.toString();
    }
    public static void main(String[] args) {
    LinkedList<Integer> linkedList = new LinkedList();
    for (int i = 0; i< 5 ; i++)
    {
        linkedList.addFirst(i);
        System.out.println(linkedList);
    }

    linkedList.add(3,666);
    System.out.println(linkedList);
    linkedList.remove(3);
    System.out.println(linkedList);
    linkedList.removeFirst();
    System.out.println(linkedList);
    linkedList.removeLast();
    System.out.println(linkedList);
}
}

 

用链表解决leetcode203题  删除链表元素  https://leetcode-cn.com/problems/remove-linked-list-elements/   虚拟头节点默认都是null  如果后面有数据 next 就不是null了

public class ListNode {
    int val;
    ListNode next;
    public ListNode(int x ){ val = x;}
}

public class Solution {
    public ListNode removeElement(ListNode head ,int val){
        while(head != null && head.val == val){
            ListNode delNode = head;
            head = head.next;
            delNode = null;      // head = head.next;
        }
        if(head == null) return null;

        ListNode prev = head;
        while(prev.next != null){
            if(prev.next.val == val)
            {
                ListNode delNode = prev.next;
                prev.next = delNode.next;
                delNode.next = null;
                //  prev.next = prev.next.next
            }else{
                prev = prev.next;
            }
        }
            return head;
    }
}


public class Solution2 {

    public ListNode removeElement(ListNode head ,int val){

        ListNode dummyHead  =  new ListNode(-1);
        dummyHead.next = head;

        ListNode prev = dummyHead;
        while(prev.next != null){
            if(prev.next.val == val)
            {
              prev.next = prev.next.next;
            }else{
                prev = prev.next;
            }
        }
            return dummyHead.next;
    }
}

 

视频地址:https://www.ixigua.com/i6818861882141573644/

 

以上是关于数据结构:链表,leetcode203题删除链表元素的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode与《代码随想录》链表篇:做题笔记与总结-JavaScript版

LeetCode Algorithm 203. 移除链表元素

一文通数据结构与算法之——链表+常见题型与解题策略+Leetcode经典题

LeetCode JavaScript实现 链表删除节点(重复指定等情况) 题型汇总

LeetCode ( 203 ) ---[移除链表元素]

LeetCode 008 链表系列