/**
* 优化的双向链表,头节点代表第1个元素。
* 节点序号从0开头
*
* @author hejinxu
*/
public class DoubleLinkedList<T> {
class Node<T> {// 节点元素
private Node<T> prev;
private T data;
private Node<T> next;
public Node() {
}
public Node(T data, Node<T> prev, Node<T> next) {
this.data = data;
this.prev = prev;
this.next = next;
}
public T data() {
return data;
}
public Node<T> prev() {
return prev;
}
public Node<T> next() {
return next;
}
boolean isHeader() {
if (this.equals(header)) {
return true;
}
return false;
}
}
private Node<T> header = null;
public void insert(T n) {
Node<T> e = new Node<T>();
e.data = n;
if (header == null)// 说明这是第一次插入元素
{
header = e;
header.next = e;
header.prev = e;
e.prev = e;
e.next = e;
return;
}
// 在最后插入元素
e.next = header;
e.prev = header.prev;
header.prev.next = e;
header.prev = e;
}
public void insert(int i, T n)// 在链表的i位置插入元素n
{
if (i < 0) {
System.out.println("插入位置不合法!!!" + "链表长度为:" + size());
return;
}
Node<T> e = new Node();
e.data = n;
// 说明这是第一次插入元素,在头结点后面插入元素
if (header == null) {
e.prev = e;
e.next = e;
header = e;
header.next = e;
header.prev = e;
return;
}
// 在最后插入元素
if (i >= size()) {
e.prev = header.prev;
e.next = header;
header.prev.next = e;
header.prev = e;
return;
}
if (i == 0) { //在头节点插入
e.next = header;
e.prev = header.prev;
header.prev.next = e;
header.prev = e;
header = e;
return;
}
// 在i位置插入元素
Node<T> temp = header;
int count = 0;
while (temp.next != header) {
count++;
if (count == i) {
e.next = temp.next;
e.prev = temp;
temp.next.prev = e;
temp.next = e;
}
temp = temp.next;
}
}
public Node<T> getNode(int i) {
if (header == null) {
return null;
}
if (i < 0 || i >= size()) {
System.out.println("输入数据有错!");
return null;
}
int count = -1;
Node<T> temp = null;
while (true) {
count++;
if (temp == null) {
temp = header;
}
if (count == i) {
break;
}
if (!temp.next.equals(header)) {
temp = temp.next;
} else {
break;
}
}
return temp;
}
public T getNodeVal(int i) {
Node<T> n = getNode(i);
if (n != null) {
return n.data;
}
return null;
}
public int size()// 返回链表的长度
{
if (header == null) {
return 0;
}
int count = 0;
Node<T> temp = header;
while (true) {
count++;
if (temp.next.equals(header)) {
break;
}
temp = temp.next;
}
return count;
}
void printList() {
if (header == null) {
return;
}
Node<T> temp = header;
while (true) {
System.out.print(temp.data + " ");
temp = temp.next;
if (temp.equals(header)) {
break;
}
}
System.out.println();
}
void deleteByIndex(int i)// 删除指定位置上的元素
{
if (i < 0 || i >= size()) {
System.out.println("删除的位置误" + "链表长度为:" + size());
}
Node<T> e = getNode(i);
if (e == header) {
//当只有一个元素时
if (e.next.equals(header)) {
header = null;
return;
}
//当只有两个元素时
if (e.prev.equals(e.next)) {
e.next.next = e.next;
e.next.prev = e.next;
header = e.next;
e = null;
return;
}
//当不止两个元素时
e.prev.next = e.next;
e.next.prev = e.prev;
header = e.next;
return;
}
//当删除的不是头节点时
e.prev.next = e.next;
e.next.prev = e.prev;
}
void deleteByEle(Node<T> element)// 删除链表中指定元素
{
}
public static void main(String[] args) {
DoubleLinkedList<String> list = new DoubleLinkedList<>();
list.insert("1永");
list.insert("2建");
list.insert("3龙");
list.insert("4志");
list.insert("5显");
list.insert("6文");
list.insert("7红");
list.insert("8李");
list.insert("9杨");
list.insert("10杰");
System.out.println("原始链表:");
list.printList();
System.out.println(list.getNode(0).prev.isHeader());
System.out.println(list.getNode(0).prev.data);
list.insert("张三");
list.printList();
System.out.println(list.getNode(0).prev.data);
}
}
用Java代码实现双向链表数据结构
最新推荐文章于 2024-07-25 16:42:46 发布