数据结构(data structure)(1)链表和线性表

2024-04-21 05:12

本文主要是介绍数据结构(data structure)(1)链表和线性表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 类和对象

对象将数据和操作打包在一起,类描述了这一切
用构造器创建(实例化)对象
类和类之间的关系
-关联(组合,聚集)
-泛化private class Student{protected String name;protected int age;protected int ability;public Student(String name,int age){this.name=name;this.age=age;}
4public  void study(){ability++;}public String toString(){return "Student{"+"name="+name+'\''+",age"+age+",ability="+ability+'}';}public boolean equals(Object o){if(this==o)return true;if(o==null||getClass()!=o.getClass())return false;Student student =(Student)o;return name.equals(student.name);}public static void main(String[] args){Student stu1=new Student();Student stu2=new Student();System.out.println(stu1.toString());System.out.println(stu1.equal(stu2));}
}

关于继承

祖先类Object
方法重写
toString方法
equals方法public class CleverStudent extends Student{public CleverStudent(String name,int age){super(name,age);}public void study(){super.study();super.study();}public void study(int s){ability+=s;}
}Comparable接口,比较大小
Comparator接口,比较器
Cloneable接口,克隆
seriazable接口,可序列化,io接入网路需要

数据结构基本概念

数据(data)
数据元素(data element)
数据对象(data object)数据是一种泛指数据对象
数据元素
数据项(数据对象)student
{(name(数据项),age)   (数据元素)
}

数据结构(data structure)

辑结构
集合:元素罗列在一起
线性结构:元素前后相继(一一对应)
树形结构:(元素存在一对多的关系)
图结构或网状结构:元素之间存在多对多的结构存储结构
-顺序存储:地址连续,用数组
-链式存储:地址不连续,用指针(引用,面向对象)Create建立
Destroy消除
Delete删除
Insert插入
Access访问
Modify修改
Sort排序
Search查找
增删改查排历

 列表:顺序表和链表

定义列表接口
用数组实现列表-MyArrayList
实现列表
Java List API

 顺序表

public interface MyList{//新增一个元素void add(Object element);//删除相同元素void delete(Object element)//根据索引删除元素void delete(int index);//将指定索引位置的·元素替换成新元素void update(int index,Object newElement);//当前列表中是否含有target元素boolean contains(Object target);//返回指定索引处元素Object indexOf(int index);}public class MyArrayList implements MyList{private int size=0//元素个数private int capacity;//容量public MyArrayList(int capacity){this.capacity=capacity;elements=new Object[capacity];
}//新增一个元素void add(Object element){if(size==capacity)//扩容{capacity*=2;//增加一倍的容量Object[] newArr=new Object[capacity];//把旧的柜子扔掉newArr[i]=elements[i];}elements[size++]=element;}//删除相同元素void delete(Object element){int index=indexOf(element);if(index>=0){delete(index);}}//根据索引删除元素void delete(int index){for(int i=index;i<size;i++){elements[i]=elements[i+1];}size--;}//将指定索引位置的·元素替换成新元素void update(int index,Object newElement){elemenyts[index]=newElement;}//当前列表中是否含有target元素boolean contains(Object target){}//返回指定索引处元素Object at(int index){return elements[index];}//查找element的索引,如果没有返回-1Object indexOf(Object element){for(int i=0;i<size;i++){if(elements[i].equals(element))return i;}return -1;}public String toString(){StringgBuilder sb=new StringBuilder("[");for(int i=0;i<size;i++){sb.append(elements[i]+(i==size-1?"":","));}sb.appen("]");return sb.toString();}}publi class MyArraylistTest{public  void add() throw Exception{MyArrayList list=new MyArrayList();list.add("nike");List.add("addidiaos");List.add("nb");}}

单链表

head头节点,Node[data,point]->[data,point]->[]->[]public class ListNode{private Object data;private ListNode next;public ListNode(data){this.data=data;}}public class SingleLinkedList implements Mylist{private ListNode first;//头节点private ListNode last;//尾节点public void add(Object element){if(first==null){//如果头节点为空,将新增节点给头节点first=new ListNode(element);last=head;//此时尾节点等于头节点}else{last.next=new ListNode(element);//新增节点last=last.Next;//尾节点更新到新增的一个节点位置上}size++;
}//新增一个元素//删除相同元素public  void delete(Object element){ListNode p=first;ListNode pre=null;//p前面的位置while(p!=null){if(p.data.equals(element)){if(p==first){//如果删除头指针元素,让头指针往后挪一位就可以了first=first.next;}pre.next=p.next;break;}pre=p;//等于p的位置,p再移动一位,pre就在p的前面了p=p.next;}size--;}//根据索引删除元素public void delete(int index){if(index<0||index>size){return;//啥也不干}int i=0;ListNode p=first;ListNode pre=null;while(p!=null){if(i==index){if(p==first){first=first.next;}else{pre.next=p.next;}break;}pre=p;p=p.next;i++;}、size--;}//将指定索引位置的·元素替换成新元素public void update(int index,Object newElement){if(index<0||index>=size){return;}int i=0;ListNode p=first;while(p!=null){if(i==index){p.data=newElement;break;}p=p.next;i++;}}//当前列表中是否含有target元素public  boolean contains(Object target){ListNode p=first;while(p!=null){if(p.data.equals(target)){return true;}p=p.next;}return false;}//返回指定索引处元素public Object at(int index){if(index<0||index>size){return;//啥也不干}int i=0;//指针指向的节点的索引ListNode p=first;while(p!=null){if(i==index){return p.data;break;}p=p.next;i++;}}public int indexOf(Object element){int i=0;//指针指向的节点的索引ListNode p=first;while(p!=null){if(p.data.equals(element)){return i;break;}p=p.next;i++;}return -1;}public String toString(){StringBuilder sb=new StringBuilder();ListNode p=first;while(p.next!=null){sb.append(p.data).append(",");p=p.next;}sb.append("]");return sb.toString();}}
//增和删链表更快

双向链表

first和last是亚元所代表的值为null<-    <-    <-
null->head->Node->Node->tail->null
a0     a1    a2    a3
双向链表结构public class ListNode{Object data;ListNode pre;ListNode next;public listNode(Object data){this.data=data;}
}public class DoubleLinkedList implements Mylist{private ListNode first=new ListNode(null);//头节点private ListNode last=new ListNode(null);//尾节点private size=0;public DoubleLinkList(){first.next=last;last.pre=first;}public void add(Object element){ListNode newNode=new ListNode(element);last.pre.next=newNode;newNode.next=last;newNode.pre=last.pre;last.pre=newNode;size++;}//新增一个元素//删除相同元素public  void delete(Object element){ListNode p=first.next;//first为nullwhile(p!=last){if(p.data.equals(element)){p.pre.next=p.next;p.next.pre=p.pre;p.next=null;p.pre=null;size--;break;}p=p.next;}}//根据索引删除元素public void delete(int index){if(index<0||index>size){return;//啥也不干}int i=0;ListNode p=first.next;//从first的下一个元素开始while(p!=last){if(i==index){p.pre.next=p.next;p.next.pre=p.pre;p.next=null;p.pre=null;size--;break;//注意这里}p=p.next;i++;}、}//将指定索引位置的·元素替换成新元素public void update(int index,Object newElement){if(index<0||index>=size){return;}int i=0;ListNode p=first.next;while(p!=last){if(i==index){p.data=newElement;break;}p=p.next;i++;}}//当前列表中是否含有target元素public  boolean contains(Object target){ListNode p=first.next;while(p!=last){if(p.data.equals(target)){return true;}p=p.next;}return false;}//返回指定索引处元素public Object at(int index){if(index<0||index>size){return;//啥也不干}int i=0;//指针指向的节点的索引ListNode p=first.next;while(p!=last){if(i==index){return p.data;break;}p=p.next;i++;}return null;}public int indexOf(Object element){int i=0;//指针指向的节点的索引ListNode p=first.next;while(p!=last){if(p.data.equals(element)){return i;break;}p=p.next;i++;}return -1;}public String toString(){StringBuilder sb=new StringBuilder();ListNode p=first.next;while(p!=last){sb.append(p.data);if(p.next!=last)sb.append(",");p=p.next;}sb.append("]");return sb.toString();}}

迭代器

public interface Iterator<E>{boolean hasNext();Object next();}public interface MyList extends Iterator{//新增一个元素void add(Object element);//删除相同元素void delete(Object element)//根据索引删除元素void delete(int index);//将指定索引位置的·元素替换成新元素void update(int index,Object newElement);//当前列表中是否含有target元素boolean contains(Object target);//返回指定索引处元素Object indexOf(int index);boolean hasNext();Object next();}public class DoubleLinkedList implements Mylist{private ListNode first=new ListNode(null);//头节点private ListNode last=new ListNode(null);//尾节点private size=0;public DoubleLinkList(){first.next=last;last.pre=first;}public void add(Object element){ListNode newNode=new ListNode(element);last.pre.next=newNode;newNode.next=last;newNode.pre=last.pre;last.pre=newNode;size++;}//新增一个元素//删除相同元素public  void delete(Object element){ListNode p=first.next;//first为nullwhile(p!=last){if(p.data.equals(element)){p.pre.next=p.next;p.next.pre=p.pre;p.next=null;p.pre=null;size--;break;}p=p.next;}}//根据索引删除元素public void delete(int index){if(index<0||index>size){return;//啥也不干}int i=0;ListNode p=first.next;//从first的下一个元素开始while(p!=last){if(i==index){p.pre.next=p.next;p.next.pre=p.pre;p.next=null;p.pre=null;size--;break;//注意这里}p=p.next;i++;}、}//将指定索引位置的·元素替换成新元素public void update(int index,Object newElement){if(index<0||index>=size){return;}int i=0;ListNode p=first.next;while(p!=last){if(i==index){p.data=newElement;break;}p=p.next;i++;}}//当前列表中是否含有target元素public  boolean contains(Object target){ListNode p=first.next;while(p!=last){if(p.data.equals(target)){return true;}p=p.next;}return false;}//返回指定索引处元素public Object at(int index){if(index<0||index>size){return;//啥也不干}int i=0;//指针指向的节点的索引ListNode p=first.next;while(p!=last){if(i==index){return p.data;break;}p=p.next;i++;}return null;}public int indexOf(Object element){int i=0;//指针指向的节点的索引ListNode p=first.next;while(p!=last){if(p.data.equals(element)){return i;break;}p=p.next;i++;}return -1;}public String toString(){StringBuilder sb=new StringBuilder();ListNode p=first.next;while(p!=last){sb.append(p.data);if(p.next!=last)sb.append(",");p=p.next;}sb.append("]");return sb.toString();}private ListNode now=first;public boolean hasNext(){return now.next!=last;;}public Object next(){ListNode next=now.next;now=now.next;return next.data;}}public iter(){while(list.hashNext()){String next=list.next();System.out.println(next);}
}//<T>泛型可以替换掉object

java List API

 

sort{set,List,Tree}collection|               |         |List           Set        Queue|     |        |
Stack ArrayList LinkedListList<String> list=new ArrayList<>();
list=new LinkedList<>();
list.add("asda");
list.remove("");Collection.sort(list);List<Student>list1=new ArrayList<>();
list1.add(new Student("zhangsan",10));
list1.add(new Student("isli",20));
Collection.sort(list1,(o1,o2)->{//camparetor排序器return o1.get()-o2.get();});for(int i=0;i<list1.size();i++){System.out.println(list1.get(i));
}//不能删东西,需要确保边界for(Student stu:list1){System.out.println(stu);
}Iterator<Student> iterator=new list1.Iterator();
//Iterator可以
while(iterator.hasNext()){System.out,println(iterator.next());
}

这篇关于数据结构(data structure)(1)链表和线性表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922225

相关文章

【数据结构】线性表:顺序表

文章目录 1. 线性表2. 顺序表2.1 概念及结构2.2 接口实现2.3 顺序表的问题及思考 1. 线性表 线性表是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式

数据结构9——排序

一、冒泡排序 冒泡排序(Bubble Sort),顾名思义,就是指越小的元素会经由交换慢慢“浮”到数列的顶端。 算法原理 从左到右,依次比较相邻的元素大小,更大的元素交换到右边;从第一组相邻元素比较到最后一组相邻元素,这一步结束最后一个元素必然是参与比较的元素中最大的元素;按照大的居右原则,重新从左到后比较,前一轮中得到的最后一个元素不参4与比较,得出新一轮的最大元素;按照上述规则,每一轮结

LeetCode--234 回文链表

题目 请判断一个链表是否为回文链表。 示例 示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val

LeetCode--206 反转链表

题目 反转一个单链表。 示例 示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL class Solution {public:ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr){return head;}ListNo

剑指offer(C++)--两个链表的第一个公共结点

题目 输入两个链表,找出它们的第一个公共结点。 解法一 两个链表一定有交点的话,方法是指向短链表指针先走完,然后指向长链表,指向长链表指针后走完,指向短链表。所以,第二次走过,一定会在交点相遇。 class Solution {public:ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {ListN

BD错误集锦3——ERROR: Can't get master address from ZooKeeper; znode data == null

hbase集群没启动,傻子!   启动集群 [s233 s234 s235]启动zk集群 $>zkServer.sh start $>zkServer.sh status   [s233] 启动dfs系统 $>start-dfs.sh 如果s237 namenode启动失败,则 [s237] $>hadoop-daemon.sh start namenode [s233]启动yarn集群

算法与数据结构面试宝典——回溯算法详解(C#,C++)

文章目录 1. 回溯算法的定义及应用场景2. 回溯算法的基本思想3. 递推关系式与回溯算法的建立4. 状态转移方法5. 边界条件与结束条件6. 算法的具体实现过程7. 回溯算法在C#,C++中的实际应用案例C#示例C++示例 8. 总结回溯算法的主要特点与应用价值 回溯算法是一种通过尝试各种可能的组合来找到所有解的算法。这种算法通常用于解决组合问题,如排列、组合、棋盘游

嵌入式学习——数据结构(哈希、排序)——day50

1. 查找二叉树、搜索二叉树、平衡二叉树 2. 哈希表——人的身份证——哈希函数 3. 哈希冲突、哈希矛盾 4. 哈希代码 4.1 创建哈希表 4.2  5. 算法设计 5.1 正确性 5.2 可读性(高内聚、低耦合) 5.3 健壮性 5.4 高效率(时间复杂度)时间复杂度越低,效率越高, 5.5 低储存(空间复杂度)空间复杂度越低,存储空间越少 6.排序算法 6.1 冒

【数据结构与算法 经典例题】使用队列实现栈(图文详解)

💓 博客主页:倔强的石头的CSDN主页               📝Gitee主页:倔强的石头的gitee主页    ⏩ 文章专栏:《数据结构与算法 经典例题》C语言                                   期待您的关注 ​​ 目录  一、问题描述 二、前置知识 三、解题思路 四、C语言实现代码 🍃队列实现代码:

数据结构:二叉树详解 c++信息学奥赛基础知识讲解

目录 一、二叉树的定义 二、二叉树的形态 三、二叉树的性质 四、二叉树的存储 五、二叉树的创建与遍历(递归) 六、二叉树实现 创建二叉树 展示二叉树 1、计算数的高度 2、计算数的叶子数量 3、计算数的宽度 4、层次遍历 5、前序遍历 递归写法 非递归写法 6、中序遍历 递归写法 非递归写法 7、后序遍历 递归写法 非递归写法 8、输出根节点到所有叶