package com.angus.learn.list;
public class MyLinkedList<T> {
// private Node<T>[] nodes;
private int size;
private Node<T> head;
private Node<T> tail;
private Node<T> current;
// private double increamentRate;
// protected static final double DEFAULT_INCREAMENT_RATE=0.75;
// protected static final double DEFAULT_NODES_LENGTH=0.75;
public MyLinkedList() {
}
public void addToHead(T data) {
if (size == 0) {
Node<T> newNode = new Node<T>(data);
this.head = newNode;
this.tail = newNode;
size++;
} else {
Node<T> newNode = new Node<T>(data);
Node<T> oldHead = this.head;
newNode.setNextNode(oldHead);
oldHead.setPreNode(newNode);
this.head = newNode;
size++;
}
// return this.head;
}
public T getHead() {
return this.head.getData();
}
public void addToTail(T data) {
if (size == 0) {
Node<T> newNode = new Node<T>(data);
this.head = newNode;
this.tail = newNode;
size++;
} else {
Node<T> newNode = new Node<T>(data);
Node<T> oldTail = this.tail;
newNode.setPreNode(oldTail);
oldTail.setNextNode(newNode);
this.tail = newNode;
size++;
}
// return this.tail;
}
public T next() {
if (current == null) {
current = head;
return current.getData();
} else if (current == tail) {
return null;
} else {
current = current.getNextNode();
return current.getData();
}
}
public T pre() {
if (current == null) {
current = tail;
return current.getData();
} else if (current == head) {
return null;
} else {
current = current.getPreNode();
return current.getData();
}
}
public boolean isEmpty() {
return size == 0;
}
public boolean hasNext() {
if (isEmpty())
return false;
if (current == null)
return true;
if (current==tail)
return false;
return true;
}
public boolean hasPre() {
if (isEmpty())
return false;
if (current == null)
return true;
if (current==head)
return false;
return true;
}
public void print(){
System.out.print("[");
//boolean flag=true;
if(head!=null){
Node<T> node=head;
while(true){
System.out.print(node);
if(node.getNextNode()==null) break;
System.out.print("->");
node=node.getNextNode();
}
}
System.out.print(",current:"+current);
System.out.println("]");
}
public static void main(String[] args) {
test1();
test2();
test3();
test4();
}
public static void test1() {
MyLinkedList<String> m=new MyLinkedList<String>();
m.addToHead("5");
m.print();
m.addToHead("4");
m.print();
m.addToHead("3");
m.print();
m.addToHead("2");
m.print();
m.addToHead("1");
m.print();
System.out.println("================================test1结束================");
}
public static void test2() {
MyLinkedList<String> m=new MyLinkedList<String>();
m.addToTail("1");
m.print();
m.addToTail("2");
m.print();
m.addToTail("3");
m.print();
m.addToTail("4");
m.print();
m.addToTail("5");
m.print();
System.out.println("================================test2结束================");
}
public static void test3() {
MyLinkedList<String> m=new MyLinkedList<String>();
m.addToHead("5");
m.print();
m.addToHead("4");
m.print();
m.addToHead("3");
m.print();
m.addToHead("2");
m.print();
m.addToHead("1");
m.print();
System.out.println();
while(m.hasNext()){
m.next();
m.print();
}
System.out.println("================================test3结束================");
}
public static void test4() {
MyLinkedList<String> m=new MyLinkedList<String>();
m.addToTail("1");
m.print();
m.addToTail("2");
m.print();
m.addToTail("3");
m.print();
m.addToTail("1");
m.print();
m.addToTail("4");
m.print();
m.addToTail("5");
m.print();
System.out.println();
while(m.hasPre()){
m.pre();
m.print();
}
System.out.println("================================test4结束================");
}
}
class Node<T> {
private Node<T> nextNode;
private Node<T> preNode;
private T data;
protected Node(T data){
this.data=data;
}
protected Node<T> getNextNode() {
return nextNode;
}
protected void setNextNode(Node<T> nextNode) {
this.nextNode = nextNode;
}
protected Node<T> getPreNode() {
return preNode;
}
protected void setPreNode(Node<T> preNode) {
this.preNode = preNode;
}
protected T getData() {
return data;
}
protected void setData(T data) {
this.data = data;
}
@Override
public boolean equals(Object obj) {
if(obj==null) return false;
if(obj instanceof Node){
if(this.data.equals(((Node) obj).data)){
return true;
}
}
return false;
}
@Override
public String toString() {
if(data==null) return null;
return data.toString();
}
}
测试结果:
[5,current:null]
[4->5,current:null]
[3->4->5,current:null]
[2->3->4->5,current:null]
[1->2->3->4->5,current:null]
================================test1结束================
[1,current:null]
[1->2,current:null]
[1->2->3,current:null]
[1->2->3->4,current:null]
[1->2->3->4->5,current:null]
================================test2结束================
[5,current:null]
[4->5,current:null]
[3->4->5,current:null]
[2->3->4->5,current:null]
[1->2->3->4->5,current:null]
[1->2->3->4->5,current:1]
[1->2->3->4->5,current:2]
[1->2->3->4->5,current:3]
[1->2->3->4->5,current:4]
[1->2->3->4->5,current:5]
================================test3结束================
[1,current:null]
[1->2,current:null]
[1->2->3,current:null]
[1->2->3->1,current:null]
[1->2->3->1->4,current:null]
[1->2->3->1->4->5,current:null]
[1->2->3->1->4->5,current:5]
[1->2->3->1->4->5,current:4]
[1->2->3->1->4->5,current:1]
[1->2->3->1->4->5,current:3]
[1->2->3->1->4->5,current:2]
[1->2->3->1->4->5,current:1]
================================test4结束================
分享到:
相关推荐
用Java定义一个双向链表,实现链表的基本操作: 初始化、获取头结点、添加新元素、删除链表元素、 获取链表元素、查找链表元素、更新链表中某个元素、 判断链表是否为空、求链表元素个数、输出链表元素、清空链表。
JAVA实现链表_双向链表
用java实现双向链表的完整操作,主要用到内部类实现。
本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...
以下是使用迭代方式实现双向链表反转的Java代码: ```java public void reverse() { if (head == null || head.next == null) { return; } Node current = head; Node previous = null; while (current != ...
主要介绍了Java实现双向链表(两个版本)的相关资料,需要的朋友可以参考下
在Java编程中,有序非循环双向链表是一种重要的数据结构,它在许多复杂的数据操作和算法实现中扮演着核心角色。有序意味着链表中的元素按照特定的顺序排列,非循环则表示链表的首节点和尾节点之间没有链接,使得遍历...
总结来说,单指针实现双向链表是一种创新的方法,它要求我们在有限的资源下实现链表的双向导航功能。通过巧妙地利用节点的状态,我们可以创建一个既节省空间又具有双向功能的数据结构。这种实现方式对于理解和优化...
下面我们将详细讲解如何实现一个自定义的Java双向链表,并参考提供的`LinkNode.java`文件来理解其内部机制。 首先,我们需要定义一个表示链表节点的类`LinkNode`。这个类通常包含三个属性:存储数据的`data`字段、...
在深入探讨如何使用C#实现双向链表之前,我们首先需要理解双向链表的基本概念及其在数据结构中的重要性。双向链表是一种线性数据结构,其中每个元素(节点)包含一个指向前一个节点和后一个节点的引用,这与只包含一...
本主题主要关注两种特殊类型的链表——双端链表(Double-ended LinkedList)和双向链表(Bidirectional LinkedList),并以Java语言实现为例进行讲解。 双端链表,也称为双链表,是一种允许在链表的两端进行插入和...
本实例聚焦于Java中的一个重要数据结构——双向链表,它在很多场景下都有着广泛的应用。双向链表与单链表相比,其独特之处在于每个节点不仅包含指向下一个节点的指针,还包含指向前一个节点的指针,这使得在链表中的...
此外,双向链表在需要快速访问相邻元素或者需要反向遍历数据时特别有用,例如在实现迭代器或某些排序算法(如插入排序)时。 在C++中,我们可以自定义一个结构体或类来表示链表的节点,通常包含数据域和两个指针域...
JAVA实现双向链表的增删功能的方法 本篇文章主要介绍了JAVA实现双向链表的增删功能的方法,包括了链表的创建、插入节点、删除节点等操作。下面将对相关知识点进行详细解释。 一、链表的基本概念 链表是一种数据...
在这个话题中,我们将深入探讨两种基本的线性数据结构——单链表和双向链表,并通过Java语言来实现它们。 单链表是一种线性数据结构,其中每个元素(称为节点)包含两个部分:数据域和指针域。数据域存储实际的数据...
本文将深入探讨双向链表及其在C++中的模板类实现,以"双向链表模板类简单实现"为主题,我们来详细了解一下这个话题。 双向链表,与单向链表不同,它的每个节点不仅包含数据,还包含两个指针,一个指向下一个节点...
在本文中,我们将深入探讨如何使用Java编程语言实现一个高效的双向链表数据结构,并通过测试用例进行验证。首先,让我们了解双向链表的基本概念。 双向链表是一种线性数据结构,其中每个节点包含两个指针,分别指向...
相信大家都明白 LinkedList 是基于双向链表而实现的,本篇文章主要讲解一下双向链表的实现,并且我们参考 LinkedList 自己实现一个单链表尝试一下。 什么是链表? 简单的来讲一下什么是链表:首先链表是一种线性的...
Java 实现双向链表实例详解 Java 实现双向链表实例详解是一种基本的数据结构,在 Java 中 LinkedList 已经实现了这种结构,但是作为开发者,也要拥有自己显示这种结构的能力。双向链表是一种动态的数据结构,它可以...