栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

顺序表和链表

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

顺序表和链表

顺序表和链表
  • 单链表(SingleLinkedList)
  • 带头单链表(LinkedListWithHead)
  • 双向链表
  • 测试
    • 带头单链表测试
    • 双向链表测试

单链表(SingleLinkedList)

链表就像是拼火车厢

package seqlist;

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

    public void add(int val) {
        Node newNode = new Node();
        newNode.val = val;

//        if (head == null) {
//            head = newNode;
//        } else {
//            newNode.next = head;
//            head = newNode;
//        }
        if (head != null) {
            newNode.next = head;
        }
        head = newNode;
        size++;
    }

    public void add(int index, int val) {
        if (index < 0 || index > size) {
            System.out.println("add index illegal!");
            return;
        }
        if (index == 0) {
            add(val);
        } else {
            Node newNode = new Node();
            newNode.val = val;
            Node prev = head;
            for (int i = 0; i < index - 1; i++) {
                prev = prev.next;
            }
            newNode.next = prev.next;
            prev.next = newNode;
            size++;
        }
    }

    public void addLast(int val) {
        add(size, val);
    }

    public int getIndexByValue(int val) {
        int index = 0;
        for (Node x = head; x != null; x = x.next) {
            if (x.val == val) {
                return index;
            }
            index++;
        }
        return -1;
    }

    public boolean isContains(int val) {
//        for (Node x = head; x != null; x = x.next) {
//            if(x.val == val){
//                return true;
//            }
//        }
//        return false;
        return getIndexByValue(val) != -1;
    }

    public int getValueByIndex(int index) {
        Node node = head;
        if (isIndexLegal(index)) {
            for (int i = 0; i < index; i++) {
                node = node.next;
            }
            return node.val;
        }
        System.out.println("index illegal!!!");
        return -1;
    }

    public int set(int index, int newVal) {
        if (isIndexLegal(index)) {
            Node x = head;
            for (int i = 0; i < index; i++) {
                x = x.next;
            }
            int oldVal = x.val;
            x.val = newVal;
            return oldVal;
        }
        System.out.println("index illegal!!!");
        return -1;
    }

    public int removeValueByIndex(int index) {
        if (isIndexLegal(index)) {
            if (index == 0) {
                Node node = head;
                head = head.next;
                node.next = null;
                size--;
                return node.val;
            }
            Node prev = head;
            for (int i = 0; i < index - 1; i++) {
                prev = prev.next;
            }
            Node node = prev.next;
            prev.next = node.next;
            node.next = null;
            size--;
            return node.val;
        }
        System.out.println("index illegal!!!");
        return -1;
    }

    public void removeValueOnce(int val) {
//        int index = 0;
//        for (Node x = head; x != null; x = x.next) {
//            if(x.val == val){
//                removeValueByIndex(index);
//                return;
//            }
//            index++;
//        }
        Node prev = head;
        if (head == null) {
            System.out.println("LinkedList is empty!");
//            return;
        } else if (head.val == val) {
            Node x = head;
            head = head.next;
            x.next = null;
            size--;
        } else {
            for (Node node = head; node.next != null; node = node.next) {
                if (node.next.val == val) {
                    Node delete = node.next;
                    node.next = delete.next;
                    delete.next = null;
                    size--;
                    return;
                }
            }
        }
    }

    public void removeAllValue(int val) {
        while (head != null && head.val == val) {//这两个条件的位置一定不能换!!!
            Node x = head;
            head = head.next;
            x.next = null;
            size--;
        }
        if (head == null) {
            return;
        }
        Node node = head;
        while (node.next != null) {
            if (node.next.val == val) {
                Node delete = node.next;
                node.next = delete.next;
                delete.next = null;
                size--;
            } else {
                node = node.next;
            }
        }
    }

    public int removeFirst() {
        return removeValueByIndex(0);
    }

    public int removeLast() {
        return removeValueByIndex(size - 1);
    }

    private boolean isIndexLegal(int index) {

//        if (index < 0 || index >= size) {
//            return false;
//        }
//        return true;

        return !(index < 0 || index >= size);
    }

    public String toString() {
        String ret = "";

//        Node x = head;
//        while (x != null) {
//            ret += x.val;
//            ret += "->";
//            x = x.next;
//        }

        for (Node x = head; x != null; x = x.next) {
            ret += x.val;
            ret += "->";
        }
        ret += "NULL";
        return ret;
    }

    public static void main(String[] args) {
        SingleLinkedList singleLinkedList = new SingleLinkedList();
        singleLinkedList.add(1);
        singleLinkedList.add(1);
        singleLinkedList.add(1);
        singleLinkedList.add(1);
        singleLinkedList.add(1);
        singleLinkedList.add(1);
        singleLinkedList.add(1);
//        singleLinkedList.add(0, 6);
//        singleLinkedList.add(singleLinkedList.size, 6);
//        singleLinkedList.addLast(7);
//        singleLinkedList.set(12, 6);
//        singleLinkedList.removeValueByIndex(0);
//        singleLinkedList.removeValueOnce(6);
        singleLinkedList.removeAllValue(1);
//        singleLinkedList.removeFirst();
//        singleLinkedList.removeLast();


//        System.out.println(singleLinkedList.getIndexByValue(6));
//        System.out.println(singleLinkedList.isContains(4));
//        System.out.println(singleLinkedList.isContains(8));
//        System.out.println(singleLinkedList.getValueByIndex(1));

        System.out.println(singleLinkedList);
    }
}

class Node {
    int val;
    Node next;

    public Node() {

    }

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

    public Node(int val, Node next) {
        this.val = val;
        this.next = next;
    }
}
带头单链表(LinkedListWithHead)
package seqlist;

public class LinkedListWithHead {
    private int size; // 当前链表中有效数据的个数(不包含头节点)
    // 实实在在存在的Node对象,不存储数据,就作为火车头
    private Node dummyHead = new Node();

    
    public void addFirst(int val) {
        // 1
//        Node node = new Node();
//        node.val = val;
//        node.next = dummyHead.next;
//        dummyHead.next = node;
        // 2
//        Node node = new Node(val,dummyHead.next);
//        dummyHead.next = node;
        // 3
        dummyHead.next = new Node(val, dummyHead.next);
        size++;
    }

    
    public void add(int index, int val) {
        if (index < 0 || index > size) {
            System.err.println("add index illegal!");
            return;
        }
        Node prev = dummyHead;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }
        // 此时prev引用就是待插入位置的前驱
        // 1.
//        Node node = new Node();
//        node.val = val;
//        node.next = prev.next;
//        prev.next = node;
        // 2.使用构造方法在产生新节点的同时给node赋值以及链接后继节点
//        Node node = new Node(val,prev.next);
//        prev.next = node;
        // 3.使用匿名对象
        prev.next = new Node(val, prev.next);
        size++;
    }

    
    public int remove(int index) {
        // 1.索引合法性
        if (rangeCheck(index)) {
            Node prev = dummyHead;
            for (int i = 0; i < index; i++) {
                prev = prev.next;
            }
            Node cur = prev.next;
            prev.next = cur.next;
            int val = cur.val;
            cur.next = cur = null;
            size--;
            return val;
        }
        System.err.println("index illegal!");
        return -1;
    }

    public void removeAllValue(int val) {
        Node prev = dummyHead;
        while (prev.next != null) {
            if (prev.next.val == val) {
                prev.next = prev.next.next;
                size--;
            } else {
                prev = prev.next;
            }
        }
    }

    private boolean rangeCheck(int index) {
        if (index < 0 || index >= size) {
            return false;
        }
        return true;
    }

    public String toString() {
        String ret = "";
        for (Node x = dummyHead.next; x != null; x = x.next) {
            ret += x.val;
            ret += "->";
        }
        ret += "NULL";
        return ret;
    }
}
双向链表
package seqlist;

import com.sun.imageio.plugins.jpeg.JPEGImageReaderResources;
import jdk.nashorn.internal.codegen.DumpBytecode;
import seqlist.leetcode.ListNode;

import java.util.Optional;

public class DoubleLinkedList {
    private int size;//有效节点个数
    private DoubleNode head;//当前头节点
    private DoubleNode tail;//当前尾结点

    //头插
    public void addFirst(int val) {
        //首先创建一个新节点
//        DoubleNode node = new DoubleNode(val);
        DoubleNode node = new DoubleNode(null, val, head);
        if (tail == null) {
            tail = node;
        } else {
//            node.next = head;
            head.prev = node;
        }
        head = node;
        size++;
    }

    //尾插
    public void addLast(int val) {
        //这个节点就是插入后的尾结点
        DoubleNode node = new DoubleNode(tail, val, null);
        if (tail == null) {
            head = node;
        } else {
            tail.next = node;
        }
        tail = node;
        size++;
    }

    public void add(int index, int val) {
        if (index < 0 || index > size) {
            System.out.println("add index illegal!");
            return;
        }
        if (index == 0) addFirst(val);
        else if (index == size) addLast(val);
        else {
//            DoubleNode prev = node(index-1);
//            DoubleNode node = new DoubleNode(prev,val,prev.next);
//            prev.next.prev = node;
//            prev.next = node;
//            size++;
            DoubleNode prev = node(index - 1);
            DoubleNode next = prev.next;
            DoubleNode cur = new DoubleNode(prev, val, next);
            prev.next = cur;
            next.prev = cur;
            size++;
        }
    }

    public int getValueByIndex(int index) {
        if (isIndexLegal(index)) {
            if (index < size / 2) {
                DoubleNode node = head;
                for (int i = 0; i < index; i++) {
                    node = node.next;
                }
                return node.val;
            } else {
                DoubleNode node = tail;
                for (int i = size - 1; i >= index; i--) {
                    node = node.prev;
                }
                return node.val;
            }
        }
        return -1;
    }

    public int setValueByIndex(int index, int newVal) {
        DoubleNode node = null;
        if (isIndexLegal(index)) {
            if (index < size / 2) {
                node = head;
                for (int i = 0; i < index; i++) {
                    node = node.next;
                }
                node.val = newVal;
            } else {
                node = tail;
                for (int i = size - 1; i >= index; i--) {
                    node = node.prev;
                }
                node.val = newVal;
            }
        }
        return -1;
    }

    public void removeIndex(int index) {
        if (index < 0 || index >= size) {
            System.out.println("remove index illegal");
            return;
        }
        DoubleNode cur = node(index);
        unlink(cur);
    }

    public void removeFirst() {
        removeIndex(0);
    }

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

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

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

    
    private void unlink(DoubleNode node) {
        DoubleNode prev = node.prev;
        DoubleNode successor = node.next;
        //1.先处理node 的前半部分
        if (prev == null) {
            head = successor;
        } else {
            //前驱不为空的情况
            prev.next = successor;
            node.prev = null;
        }
        //2.再处理后半部分的情况
        if (successor == null) {
            tail = prev;
        } else {
            successor.prev = prev;
            node.next = null;
        }
        size--;
    }

    //根据索引值找到对应的节点
    private DoubleNode node(int index) {
        DoubleNode x = null;
        if (index < size / 2) {
            x = head;
            for (int i = 0; i < index; i++) {
                x = x.next;
            }
        } else {
            x = tail;
            for (int i = size - 1; i > index; i--) {
                x = x.prev;
            }
        }
        return x;
    }

    public boolean isIndexLegal(int index) {
//        if(index < 0 || index >= size){
//            return false;
//        }
//        return true;
        return !(index < 0 || index >= size);
    }

    public String toString() {
        String ret = "";
        for (DoubleNode x = head; x != null; x = x.next) {
            ret += x.val;
            ret += "->";
        }
        ret += "NULL";
        return ret;
    }
}

class DoubleNode {
    DoubleNode prev;//前驱节点

    int val;//当前节点值

    DoubleNode next;//后继节点

    public DoubleNode() {
    }

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

    public DoubleNode(DoubleNode prev, int val, DoubleNode next) {
        this.prev = prev;
        this.val = val;
        this.next = next;
    }
}
测试 带头单链表测试
package seqlist;

public class LinkedListWithHeadTest {
    public static void main(String[] args) {
        LinkedListWithHead linkedListWithHead = new LinkedListWithHead();
        linkedListWithHead.addFirst(3);
        linkedListWithHead.addFirst(2);
        linkedListWithHead.addFirst(2);
        linkedListWithHead.addFirst(3);
        linkedListWithHead.addFirst(2);
        // 2->2->2->2->3
        System.out.println(linkedListWithHead);
        linkedListWithHead.removeAllValue(2);
        System.out.println(linkedListWithHead);
//        System.out.println("----------------");
//        System.out.println(linkedListWithHead.remove(0));
//        System.out.println(linkedListWithHead.remove(1));
//        System.out.println(linkedListWithHead);
    }
}
双向链表测试
package seqlist;

public class DoubleLinkTest {
    public static void main(String[] args) {
        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
        doubleLinkedList.addLast(1);
        doubleLinkedList.addLast(3);
        doubleLinkedList.addLast(3);
        doubleLinkedList.addLast(2);
        doubleLinkedList.addLast(3);
        doubleLinkedList.removeValueByValue(3);
        System.out.println(doubleLinkedList);
//        doubleLinkedList.addLast(1);
//        doubleLinkedList.addLast(3);
//        doubleLinkedList.addLast(5);
//        doubleLinkedList.add(1,2);
//        doubleLinkedList.add(1,4);
//
//        System.out.println(doubleLinkedList);
//        doubleLinkedList.removeFirst();
//        doubleLinkedList.removeLast();
//        System.out.println(doubleLinkedList);
//        System.out.println("---------------");
//        doubleLinkedList.removeIndex(1);
//        System.out.println(doubleLinkedList);
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/860234.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号