自定义数据结构 链表(单项 ,双向,环形)

编程技术  /  houtizong 发布于 3年前   75

 

   链表与动态数组的实现方式差不多,    数组适合快速删除某个元素    链表则可以快速的保存数组并且可以是不连续的

 

   

单项链表;数据从第一个指向最后一个

 

实现代码:

 

    

//定义动态链表class  Node<E>{E e;//定义的节点Node next;//节点的下一个Node front ;//节点的前一个public Node(E e){        this.e =(E)e;}public  String toString(){return (String)e;}}//创建单项链表类public class LinkedList{public static void main(String[] args) {LinkedList list  = new LinkedList();Node node=list.creatNode();list.printlist(node);}public Node<String> creatNode(){Node<String> node = new  Node<String>("节点一");Node<String> node2 = new  Node<String>("节点二");Node<String> node3 = new  Node<String>("节点三");    Node<String> node4 = new  Node<String>("节点四");node.next = node2;node2.next = node3;node3.next = node4;node4.front = node3;node3.front = node2;node2.front = node;return node;}public void printlist(Node node){       while(node!=null){   System.out.println(node);   node = node.next;   }}}

 运行结果:

节点一

节点二

节点三

节点四

 

 

 

双向链表:可以指定前面节点也可以指向后面数据的节点

    实现链表的增删改查 等方法

 

    

/** * 节点类 *  * @author kowloon *  */public class Node<E> {E e;// 节点中的元素Node<E> front;// 对前一个节点的引用Node<E> next;// 对下一个节点的引用public Node(E e) {this.e = e;}@Overridepublic String toString() {return (String) e;}}

 

节点的方法

package trr0717链表;public class LinkedList1 {Node head = null;Node foot = null;int count = 0;public Node getHead() {return head;}// 直接在后面增加节点public void add(String s) {Node node = new Node(s);if (head == null) {// 当没有头节点的时候head = node;foot = node;} else {// 双链表foot.next = node;node.front = foot;}foot = node;count++;}// 直接在后面增加节点public void add(int index, String s) {if (index < 0 || index >= size()) {// 若数组越界就抛出异常throw new IndexOutOfBoundsException("数组的个数:" + size() + "第几个数组"+ index);}Node nodenew = new Node(s);Node node = getNode(index);if (index == 0) {// 若是o下标node.front = nodenew;nodenew.next = node;head = nodenew;/* System.out.println(head+"<><><><"); */} else {Node frontnode = node.front;Node nextnode = node.next;frontnode.next = nodenew;nodenew.next = nextnode;nodenew.front = frontnode;nextnode.front = nodenew;}count++;}// 移除指定位置的节点public void remove(int index) {if (index < 0 || index >= size()) {// 若数组越界就抛出异常throw new IndexOutOfBoundsException("数组的个数:" + size() + "第几个数组"+ index);}if (index == 0) {Node n = head.next;// 先要接触引用关系head.next = null;n.front = null;head = n;}else {Node node = getNode(index);// 得到指定位置上下一个节点Node fnode = node.front;Node nextnode = node.next;fnode.next = nextnode;// 把指定位置的下一个节点给他上一个节点nextnode.front = fnode;}count--;}// 移除指定内容的节点public void remove(String s) {Node node = head;for (int i = 0; i < size(); i++) {if (node.e.equals(s)) {// 若相等remove(i);break;}node = node.next;}}// 修改指定地点的节点内容public void set(int index, String s) {Node n = getNode(index);n.e = s;}// 取得某个节点对象public Node getNode(int index) {if (index < 0 || index >= size()) {// 若数组越界就抛出异常throw new IndexOutOfBoundsException("数组的个数:" + size() + "第几个下标"+ index);}int i = 0;Node node = head;// 把head也放到队列里面while (i < index) {i++;node = node.next;}/* System.out.println("第"+i+"个节点:"+node); */return node;}// 链表的大小public int size() {System.out.println("数组个数:" + count);return count;}// 遍历链表的方法public static void linkedVist(Node head) {if (head != null) {System.out.println(head);Node node = head.next;linkedVist(node);}}}

 

     

 

 

    

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客