博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
双向链表_Java
阅读量:7028 次
发布时间:2019-06-28

本文共 5407 字,大约阅读时间需要 18 分钟。

public class DuLinkList
{ private class Node{ private T data; private Node prev; private Node next; @SuppressWarnings("unused") public Node(){ } public Node(T data , Node prev , Node next){ this.data = data; this.prev = prev; this.next = next; } } private Node header; private Node tail; private int size; public DuLinkList(){ header = null; tail = null; } public DuLinkList(T element){ header = new Node(element, null , null); tail = header; size++; } public int length(){ return size; } public T get(int index){ return getNodeByIndex(index).data; } private Node getNodeByIndex(int index) { if(index < 0 || index > size){ throw new IndexOutOfBoundsException("线性表索引越界"); } if(index <= size/2){ //从header节点开始搜索 Node current = header; for(int i = 0 ; i <= size/2 && current != null ; i++ , current = current.next){ if(i == index){ return current; } } } else { //从tail节点开始搜索 Node current = tail; for(int i = size-1 ; i > size/2 && current != null ; i++ , current = current.prev){ if(i == index){ return current; } } } return null; } public int locate(T element){ Node current = header; for(int i = 0 ; i < size && current != null ; i++ , current = current.next){ if(current.data.equals(element)){ return i; } } return -1; } public void insert(T element , int index){ if(index < 0 || index > size){ throw new IndexOutOfBoundsException("线性表索引越界"); } if(header == null){ add(element); } else { if(index == 0){ addAtHeader(element); } else { Node prev = getNodeByIndex(index - 1); Node next = prev.next; Node newNode = new Node(element , prev , next); prev.next = newNode; next.prev = newNode; size++; } } } private void addAtHeader(T element) { header = new Node(element , null , header); if(tail == null){ tail = header; } size++; } public void add(T element) { if(header == null){ header = new Node(element , null , null); tail = header; } else { Node newNode = new Node(element , tail , null); tail.next = newNode; tail = newNode; } size++; } public T delete(int index){ if(index < 0 || index > size){ throw new IndexOutOfBoundsException("线性表索引越界"); } Node del = null; if(index == 0){ del = header; header = header.next; header.prev = null; del.next = null; } else { Node prev = getNodeByIndex(index - 1); del = prev.next; prev.next = del.next; if(del.next != null){ del.next.prev = del.prev; del.next = null; } del.prev = null; } size--; return del.data; } public T remove(){ return delete(size - 1); } public boolean empty(){ return size == 0; } public void clear(){ header = null; tail = null; size = 0; } public String toString(){ if(empty()){ return "[]"; } else { StringBuilder sb = new StringBuilder("["); for(Node current = header ; current != null ; current = current.next){ sb.append(current.data.toString() + ", "); } int len = sb.length(); return sb.delete(len-2, len).append("]").toString(); } } public String reverseToString(){ if(empty()){ return "[]"; } else { StringBuilder sb = new StringBuilder("["); for(Node current = tail ; current != null ; current = current.prev){ sb.append(current.data.toString() + ", "); } int len = sb.length(); return sb.delete(len-2, len).append("]").toString(); } }}

测试代码:

public class DuLinkListTest {    public static void main(String[] args) {        DuLinkList
list = new DuLinkList
(); list.insert("aaaa", 0); list.add("bbbb"); list.insert("cccc", 0); list.insert("dddd", 1); System.out.println(list); list.delete(2); System.out.println(list); System.out.println(list.reverseToString()); System.out.println("cccc在顺序线性表中的位置:" + list.locate("cccc")); System.out.println("链表中索引1处的元素: " + list.get(1)); list.remove(); System.out.println("调用remove方法后的链表: " + list); list.delete(0); System.out.println("调用delete(0)后的链表: " + list); }}

测试结果:

[cccc, dddd, aaaa, bbbb][cccc, dddd, bbbb][bbbb, dddd, cccc]cccc在顺序线性表中的位置:0链表中索引1处的元素: dddd调用remove方法后的链表: [cccc, dddd]调用delete(0)后的链表: [dddd]

 

转载于:https://www.cnblogs.com/bleachzk/p/3665547.html

你可能感兴趣的文章
phalcon 连接多个数据库 phalcon multi-database
查看>>
React Native(十一)——按钮重复点击事件的处理
查看>>
机器学习笔记(4):多类逻辑回归-使用gluton
查看>>
26.angularJS $routeProvider
查看>>
内存映射函数remap_pfn_range学习——示例分析(2)
查看>>
年轻的工程师如何月入伍万XD
查看>>
NAT64与DNS64基本原理概述
查看>>
Java-Shiro(四):Shiro
查看>>
Oracle 备份、恢复单表或多表数据步骤
查看>>
ubuntu 步步为营之uclinux编译和移植(完整版)
查看>>
Lintcode: Partition Array
查看>>
sudo 之后 unable to resolve host的问题解决办法
查看>>
那些PHP中没有全称的简写
查看>>
【elasticsearch】python下的使用
查看>>
python字符串和编码
查看>>
JS实现表单多文件上传样式美化支持选中文件后删除相关项
查看>>
高可用高并发常用到的9种技术
查看>>
数字签名
查看>>
SQL Server数据库中批量替换数据的方法
查看>>
QTP 浏览器最大化、最小化,适用于IE6\7\8
查看>>