2021年,我做了这些java中的链表知识点总结

2021年,我做了这些java中的链表知识点总结,第1张

2021年,我做了这些java中的链表知识点总结

链表:逻辑上连续,多个节点采用挂载的方式进行连接,物理上不连续.链表分为单链表和双链表.

一丶单链表 ①链表的实现(增删改查):
// 1、无头单向非循环链表实现
public class SinglelinkedList {
     //头插法
 
     public void addFirst(int val){
     //尾插法
}
     public void addLast(int val){
     //任意位置插入,第一个数据节点为0号下标
 
}
     public boolean addIndex(int index,int data){
     //查找是否包含关键字key是否在单链表当中
 
}
     public boolean contains(int key){
     //删除第一次出现关键字为key的节点
 
}
     public void remove(int key){
     //删除所有值为key的节点
 
}
     public void removeAllKey(int key){
 
}
  
 }
②创建节点 :

 

class Node {
    int val;
    Node next;

    public Node(int val) {
        this.val = val;
    }
}

具体代码实现:

package singallink;

public class SingallinkedList {
    private int size;
    private Node head;

    public void addFirst(int val) {
        Node node = new Node(val);
        if(head == null){
            head = node;
        }else{
            node.next = head;
            head = node;
        }
        size++;
    }
    public void addIndex(int index,int val){
        if(index < 0 || index > size){
            System.out.println("add index illegal");
            return;
        }
        if(index == 0){
            addFirst(val);
            return;
        }
        Node node = new Node(val);
        Node prev = head;
        for (int i = 0; i < index - 1; i++) {
            prev = prev.next;
        }
        node.next = prev.next;
        prev.next = node;
        size++;
    }
    public void addLast(int val){
        addIndex(size,val);
       
    }
     public int seek(int index){
          if(rangeCheck(index)){
              Node node = head;
              for (int i = 0; i < index; i++) {
                  node = node.next;
              }
              return node.val;
          }else{
              System.out.println("get index illegal");
              return -1;
          }
     }

      public boolean contains(int val){
          for (Node i = head; i != null; i=i.next) {
              if(i.val == val){
                  return true;
              }
          }
          return false;
      }

      public int modify(int index,int newVal){
        if(rangeCheck(index)){
            Node node = head;
            for (int i = 0; i < index; i++) {
                node = node.next;
            }
            int oldVal = node.val;
            node.val = newVal;
            return oldVal;
        }else{
            System.out.println("modify index illegal");
            return -1;
        }
      }

      public void removeIndex(int index){
        if(rangeCheck(index)){
            if(index == 0){
                Node temp = head;
                head = head.next;
                temp.next = null;
                size--;
            }
            Node prev = head;
            for (int i = 0; i < index; i++) {
                prev = prev.next;
            }
            Node cur = prev.next;
            prev.next = cur.next;
            cur.next = null;
            size--;
        }else{
            System.out.println("remove index illegal!");
        }
      }
      public void removeFirst(){
        removeIndex(0);
      }

      public void removeLast(){
        removeIndex(size-1);
      }

      public void removevalonce(int val){
        if(rangeCheck(val)){
            if(head != null && head.val == val){
                Node temp = head;
                head = head.next;
                temp.next = null;
                size--;
            }else{
                Node prev = head;
                while(prev.next != null){
                    if(prev.next.val == val){
                        Node cur = prev.next;
                        prev.next = cur.next;
                        cur.next = null;
                        size--;
                        return;
                    }
                    prev = prev.next;
                }
            }
        }
      }

      public void removevalAll(int val){
        while(head != null && head.val == val){
            head = head.next;
            size--;
        }
        if(head == null){
            return;
        }else{
            Node prev = head;
            while(prev.next != null){
                if(prev.next.val == val){
                    Node cur = prev.next;
                    prev.next = cur.next;
                    cur.next = null;
                    size--;
                }else{
                    prev = prev.next;
                }
            }
        }
      }

     public boolean rangeCheck(int index){
        if(index < 0 || index >= size){
            return false;
        }
        return true;
     }
    public String toString(){
        String ret = "";
        Node node = head;
        while(node != null){
            ret+=node.val;
            ret+="->";
            node = node.next;
        }
        ret+="END";
        return ret;
    }
}

class Node {
    int val;
    Node next;

    public Node(int val) {
        this.val = val;
    }
}
 二丶双链表 ①链表的实现:
public class DoublelinkedList {
     //头插法
     public void addFirst(int val){
 
}
     //尾插法
     public void addLast(int val){
 
}
     //任意位置插入,第一个数据节点为0号下标
     public boolean addIndex(int index,int val){
 
}
     //查找值val是否在双链表当中
     public boolean contains(int val){
 
}
     //删除第一次出现值为val的节点
     public void remove(int val){
 
}
     //删除所有值为val的节点
     public void removeAllval(int val){
 
}
   
}
②构造节点

 

class Node{
    Node prev;
    int val;
    Node next;

    public Node(int val) {
        this.val = val;
    }

    public Node(Node prev, int val, Node next) {
        this.prev = prev;
        this.val = val;
        this.next = next;
    }
}

 具体代码实现:

package doublelink;

public class DoublelinkedList {
    private Node head;
    private int size;
    private Node tail;

    public void addFirst(int val){
        Node node = new Node(null,val,head);
        if(head == null){
            tail = node;
        }else{
            head.prev = node;
        }
        head = node;
        size++;
    }
    public void addLast(int val){
        Node node = new Node(tail,val,null);
        if(tail == null){
            head = node;
        }else{
            tail.next = node;
        }
        tail = node;
        size++;
    }
    public void addIndex(int index,int val){
        if(index < 0 ||index > size){
            System.out.println("add index illegal!");
        }else if(index == 0){
            addFirst(val);
        }else if(index == size){
            addLast(val);
        }else{
            Node prev = node(index - 1);
            Node newNode = new Node(prev,val,prev.next);
            prev.next.prev = newNode;
            prev.next = newNode;
            size++;
        }
    }
    public int get(int index){
        if(rangeCheck(index)){
            return node(index).val;
            }else{
            System.out.println("get index illegal!");
            return -1;
        }
    }
    private Node node (int index){
        Node ret = null;
        if(index < (size << 1)){
            ret = head;
            for (int i = 0; i < index; i++) {
                ret = ret .next;
            }
        }else{
            ret = tail;
            for (int i = size-1; i > index; i--) {
                ret = ret.prev;
            }
        }
        return ret;
    }
    public boolean contains(int val){
        for(Node x = head;x != null;x = x.next){
            if(x.val == val){
                return true;
            }
        }
        return false;
    }
    public int set(int index,int newVal){
        if(rangeCheck(index)){
            Node node = node(index);
            int oldVal = node.val;
            node.val = newVal;
            return oldVal;
        }else{
            System.err.println("set index illegal!");
            return -1;
        }
    }

    public void remove(int index){
        if(rangeCheck(index)){
            Node node = node(index);
            unlink(node);
        }else{
            System.out.println("remove index illegal!");
        }
    }

     public void removevalonce(int val){
        for(Node x = head;x != null;x=x.next){
            if(x.val == val){
                unlink(x);
                break;
            }
        }
}

     public void removevalAll(int val){
        for(Node x = head;x != null;){
            if(x.val == val){
                Node next = x.next;
                unlink(x);
                x = next;
            }else{
                x = x.next;
            }
        }
     }

    private void unlink(Node node){
        Node prev = node.prev;
        Node next = node.next;
        if(prev == null){
            head = next;
        }else{
            prev.next = node.next;
            node.prev = null;
        }
        if(next == null){
            tail = node.prev;
        }else{
            next.prev = prev;
            node.next = null;
        }
        size--;
    }
    public boolean rangeCheck(int index){
        if(index < 0 || index >= size){
            return false;
        }else{
            return true;
        }
    }

    public String toString(){
        String ret = "";
        Node node = head;
        while(node != null){
            ret += node.val + "->";
            node = node.next;
        }
        ret += "END";
        return ret;
    }
}

class Node{
    Node prev;
    int val;
    Node next;

    public Node(int val) {
        this.val = val;
    }

    public Node(Node prev, int val, Node next) {
        this.prev = prev;
        this.val = val;
        this.next = next;
    }
}

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5684060.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存