zoukankan      html  css  js  c++  java
  • 数据结构之链表的实现

    链表的概念:链表也是线性表的一种,链表的逻辑结构和物理结构并不相同,链表的元素包含指针和数据值。

    链表的优点:链表易于删除和插入,时间复杂度是O(1)

       缺点:不利于查找,复杂度是O(n)

    链表的java实现

    节点类Node

    package LinkList;
    /*
    * 首先定义node类
    * node包含三个变量
    * 1.获取和设置本节点数据
    * 2.获取和设置下一个点的地址
    * 3.获取和设置上个节点的地址*/
    
    public class Node {
        public Object data;
        public Node next;
        public Node before;
        public Node() {
    
        }
        public Node(Object data){
            super();
            this.data = data;
        }
    
        public Object getData() {
            return data;
        }
    
        public void setData(Object data) {
            this.data = data;
        }
    
        public Node getNext() {
            return next;
        }
    
        public void setNext(Node next) {
            this.next = next;
        }
    
        public Node getBefore() {
            return before;
        }
    
        public void setBefore(Node before) {
            this.before = before;
        }
    }

    链表实现类MyLinklist

    package LinkList;
    
    
    public class MyLinkList<E> {
        // 实例化根节点,头节点一般没有数据
        private Node root = new Node();
        private Node next;
        private Node last;
        private int size;
    
        // 获取size
        public int getSize(){
            return size;
        }
    
        //
        public void add(Object data){
            // 实例化下个节点
            next = new Node(data);
            if (size == 0){
                // 存入root的下个节点地址中存放next
                root.setNext(next);
                last = next;
                size++;
            }else {
                // 存入最后一个节点中,每次存入的next地址不同
                last.setNext(next);
                last = next;
                size++;
            }
    
        }
    
        //
        public Object searchByIndex(int index)throws Exception{
            if (index<0 || index>size-1){
                throw new Exception("查找节点不存在");
    
            }else{
                // 第0个节点
                Node indexNode = root.getNext();
                // 第index-1个节点
                for (int i =0;i<index;i++){
                    indexNode = indexNode.getNext();
                }
                return indexNode.getData();
            }
    
        }
    
        //
        public void updateByIndex(int index,E e) throws Exception {
            if (index<0 || index>size-1){
                throw new Exception("更新节点节点不存在");
            }else{
                Node indexNode = root.getNext();
                for (int i =0;i<index;i++){
                    indexNode = indexNode.getNext();
                }
                indexNode.setData(e);
            }
        }
    
        //
        public void deleteByIndex(int index) throws Exception {
            if (index<0 || index>size-1){
                throw new Exception("删除节点不存在");
            }else {
                Node indexNode = root.getNext();
                Node indexNodeNext = root.getNext();
                Node indexNodeBefore = root.getNext();
                // 删除是最后一个节点
                if (index == size -1){
                    for (int i = 0;i<index-1;i++){
                        // 得到要删除节点的前一个的点
                        indexNodeBefore = indexNodeBefore.getNext();
                    }
                    indexNodeBefore.setNext(null);
                    size--;
                }else if (index == 0){
                    // 查找位置为第0个节点
                    for (int i =0;i<1;i++){
                        // 获得第一个节点
                        indexNodeNext = indexNodeNext.getNext();
                    }
                    root.setNext(indexNodeNext);
                    size--;
    
    
                }else {
                    for (int i = 0;i<index-1;i++){
                        // 得到要删除节点的前一个的点
                        indexNodeBefore = indexNodeBefore.getNext();
                    }
                    for (int i = 0;i<index+1;i++){
                        // 得到要删除节点的后一个的点
                        indexNodeNext = indexNodeNext.getNext();
                    }
                    indexNodeBefore.setNext(indexNodeNext);
                    size--;
                }
    
            }
        }
    
        // 插入
        public void insertData(int index,E e) throws Exception {
            if (index<0 || index>size){
                throw new Exception("插入节点不存在");
            }else {
                Node indexNode = new Node(e);
                Node indexNodeNext = root.getNext();
                Node indexNodeBefore = root.getNext();
    
                if (index == size ){
                    // 加入是尾部
                    add(e);
                }else if (index == 0){
                    // 查找位置为第0个节点
                    root.setNext(indexNode);
                    indexNode.setNext(indexNodeNext);
                    size++;
    
                }else {
                    for (int i = 0;i<index-1;i++){
                        // 得到要删除节点的前一个的点
                        indexNodeBefore = indexNodeBefore.getNext();
                    }
                    for (int i = 0;i<index+1;i++){
                        // 得到要删除节点的后一个的点
                        indexNodeNext = indexNodeNext.getNext();
                    }
                    indexNodeBefore.setNext(indexNode);
                    indexNode.setNext(indexNodeNext);
                    size++;
                }
    
            }
        }
    
        // 添加循环列表,增删改查需要修改
        public void addCycleList(E e){
            // 实例化下个节点
            next = new Node(e);
            if (size == 0){
                // 存入root的下个节点地址中存放next
                root.setNext(next);
                last = next; // 只有一个节点不需要指向自己
                size++;
            }else {
                // 存入最后一个节点中,每次存入的next地址不同
                last.setNext(next);
                last = next;
                last.setNext(root.getNext()); // 指向第0个节点位置
                size++;
            }
    
        }
    
        // 添加循环列表,增删改查需要修改
        public void addDoubleOrientList(E e){
            // 实例化下个节点
            next = new Node(e);
            if (size == 0){
                // 存入root的下个节点地址中存放next
                root.setNext(next);
                last = next; // 只有一个节点不需要指向自己
                size++;
            }else {
                // 存入最后一个节点中,每次存入的next地址不同
                last.setNext(next);
                next.setBefore(last);
                last = next;
                size++;
            }
    
        }
    }

    测试类Test

    public class Test {
        public static void main(String[] args) throws Exception {
            MyLinkList<Comparable> myLinkList= new MyLinkList<Comparable>();
            myLinkList.add(1);
            myLinkList.add(2);
            myLinkList.add(3);
    //        myLinkList.updateByIndex(1,11);
    //        System.out.println(myLinkList.searchByIndex(1));
    //        myLinkList.deleteByIndex(1);
    //        System.out.println(myLinkList.searchByIndex(1));
    //        myLinkList.insertData(1,11);
    //        System.out.println(myLinkList.searchByIndex(1));
    //        System.out.println(myLinkList.getSize());
            myLinkList.deleteByIndex(2);
            System.out.println(myLinkList.searchByIndex(1));
        }
    }

    链表的python实现

    class SingleNode(object):
        # 创建节点类
        def __init__(self,data):
            # 存放数据
            self.data = data
            # 下一个节点
            self.next = None
    
    
    
    class SingleLinkList(object):
        def __init__(self):
            # 初始化头节点
            self.root = SingleNode(None)
            self.nextNode = None
            self.beforeNode = None
            self.lastNode = None
            self.size = 0
    
        # 查找长度
        def getSize(self):
            return self.size
    
        #
        def add(self,data):
            if self.size ==0:
                self.nextNode = SingleNode(data)
                self.root.next = self.nextNode
                self.lastNode = self.nextNode
                self.size+=1
    
            else:
                self.nextNode = SingleNode(data)
                self.lastNode.next = self.nextNode
                self.lastNode = self.nextNode
                self.size +=1
        #
        def removeByIndex(self,index):
            if index<0 or self.size-1<index:
                print("删除节点不存在")
            elif index == self.size-1:
                indexNodebefore = self.root.next
                for i in range(index-1):
                    indexNodebefore = indexNodebefore.next
                indexNodebefore.next = None
                self.size -=1
            elif index == 0:
                indexNodeNext = self.root.next
                for i in range(index+1):
                    indexNodeNext = indexNodeNext.next
                self.root.next = indexNodeNext
                self.size -=1
            else:
                indexNodebefore = self.root.next
                indexNodeNext = self.root.next
                for i in range(index - 1):
                    indexNodebefore = indexNodebefore.next
                for i in range(index+1):
                    indexNodeNext = indexNodeNext.next
                indexNodebefore.next = None
                indexNodebefore.next = indexNodeNext
                self.size -=1
    
        #
        def updataByIndex(self,index,data):
            if index < 0 or self.size - 1 < index:
                print("删除节点不存在")
            else:
                indexNode = self.root.next
                for i in range(index):
                    indexNode = indexNode.next
                indexNode.data = data
    
        #
        def searchByIndex(self,index):
            if index < 0 or self.size - 1 < index:
                print("查找节点不存在")
            else:
                indexNode = self.root.next
                for i in range(index):
                    indexNode = indexNode.next
                return indexNode.data
    
        # 插入
        def insertByIndex(self,index,data):
            if index<0 or self.size<index:
                print("插入节点不存在")
            elif index == self.size:
                SingleLinkList.add(data)
            elif index == 0:
                indexNode = SingleNode(data)
                indexNodeNext = self.root.next
                self.root.next = indexNode
                indexNode.next = indexNodeNext
                self.size +=1
            else:
                indexNode = SingleNode(data)
                indexNodebefore = self.root.next
                indexNodeNext = self.root.next
                for i in range(index - 1):
                    indexNodebefore = indexNodebefore.next
                for i in range(index+1):
                    indexNodeNext = indexNodeNext.next
                indexNodebefore.next = indexNode
                indexNode.next = indexNodeNext
                self.size +=1
    
    
    list = SingleLinkList()
    list.add(1)
    list.add(2)
    list.add(3)
    print("====增======")
    print(list.searchByIndex(0))
    print(list.size)
    print("====删======")
    list.removeByIndex(0)
    print(list.searchByIndex(0))
    print(list.size)
    print("====改======")
    list.updataByIndex(0,20)
    print(list.searchByIndex(0))
    print(list.size)
    print("====插入======")
    list.insertByIndex(0,11)
    print(list.searchByIndex(0))
    print(list.size)
  • 相关阅读:
    序号正确
    基于visual Studio2013解决C语言竞赛题之1071打印工资
    基于visual Studio2013解决C语言竞赛题之1070删除相同节点
    基于visual Studio2013解决C语言竞赛题之1069链表查找删除
    基于visual Studio2013解决C语言竞赛题之1068指针数组
    基于visual Studio2013解决C语言竞赛题之1067间隔排序
    基于visual Studio2013解决C语言竞赛题之1066进制转化
    基于visual Studio2013解决C语言竞赛题之1065二维排序
    基于visual Studio2013解决C语言竞赛题之1064互质数差1验证
    基于visual Studio2013解决C语言竞赛题之1063分橘子
  • 原文地址:https://www.cnblogs.com/wigginess/p/13619772.html
Copyright © 2011-2022 走看看