java 双向链表循环_数据结构 Java循环双向链表

这篇博客详细介绍了如何实现一个双向链表,包括初始化、判断表空、添加元素(addBefore、addFirst、addLast)和删除元素的方法。文章通过代码示例展示了这些操作的细节,特别强调了addBefore方法在链表操作中的核心作用。此外,还实现了迭代器和列表迭代器以支持遍历和修改链表。
摘要由CSDN通过智能技术生成

this来初始化链接域 prev 和 next.图⑴

prev = this; next = this;

■ 判断表空的条件

public boolean isEmpty() {

return (header.prev == header || header.next == header);

}

图⑴

01b0b46b24e85ad879f67c48d69ddaf5.png

■ addBefore 方法是 MyLinkedList 类的重要方法, 后面的很多方法都要依靠它来实现!图⑵

private static DNode addBefore(DNode curr, T item) {

DNode newNode, prevNode;

newNode = new DNode(item);

prevNode = curr.prev;

newNode.prev = prevNode; ①

newNode.next = curr; ②

prevNode.next = newNode; ③

curr.prev = newNode; ④

return newNode;

}

图⑵

38251ce1e85b83c1935cf3e6c80d3680.png

■ addFirst方法就是靠addBefore来实现的!

因为

header.next = nd'  -->图⑵

所以

curr = nd'  --> addBefore()方法

因此

prevNode = curr.prev = h  --> addBefore()方法

继续重复这四句话

newNode.prev = prevNode; ①

newNode.next = curr; ②

prevNode.next = newNode; ③

curr.prev = newNode; ④

public void addFirst(T item) {

addBefore(header.next, item);

listSize++;

}

图⑶

e6c6e60cb507d04424887e3c17798d3c.png

■ remove方法也很重要!

private void remove(DNode curr) {

if(curr.next == curr) return;

DNode prevNode = curr.prev, nextNode = curr.next;

prevNode.next = nextNode;

nextNode.prev= prevNode;

}

package LinkedList;

import java.util.Iterator;

import java.util.ListIterator;

import java.util.NoSuchElementException;

public class MyLinkedList {

//*************************************************************

private DNode header;

private int listSize;

//*************************************************************

public MyLinkedList() {

header = new DNode();

listSize = 0;

}

//*************************************************************

private static class DNode {

T nodeValue;

DNode prev;

DNode next;

public DNode() { // for header

nodeValue = null;

prev = this; // left

next = this; // right

}

public DNode(T item) {

nodeValue = item;

prev = this;

next = this;

}

}

//**************************************************************

public boolean isEmpty() {

return (header.prev == header || header.next == header);

}

public int size() {

return listSize;

}

//**************************************************************

private DNode addBefore(DNode curr, T item) {

DNode newNode, prevNode;

newNode = new DNode(item);

prevNode = curr.prev;

newNode.prev = prevNode;

newNode.next = curr;

prevNode.next = newNode;

curr.prev = newNode;

return newNode;

}

public boolean add(T item) {

addBefore(header, item);

listSize++;

return true;

}

public void addFirst(T item) {

addBefore(header.next, item);

listSize++;

}

public void addLast(T item) {

addBefore(header, item);

listSize++;

}

//**************************************************************

private void remove(DNode curr) {

if(curr.next == curr) return;

DNode prevNode = curr.prev, nextNode = curr.next;

prevNode.next = nextNode;

nextNode.prev= prevNode;

}

public boolean remove(Object o) {

for(DNode p = header.next; p != header; p = p.next) {

if(o.equals(p.nodeValue)) {

remove(p);

listSize--;

return true;

}

}

return false;

}

//**************************************************************

public void printList() {

for(DNode p = header.next; p != header; p = p.next)

System.out.println(p.nodeValue);

}

//**************************************************************

private class MyIterator implements Iterator {

public DNode nextNode = header.next;

public DNode lastReturned = header;

public boolean hasNext() {

return nextNode != header;

}

public T next() {

if(nextNode == header)

throw new NoSuchElementException("");

lastReturned = nextNode;

nextNode = nextNode.next;

return lastReturned.nodeValue;

}

public void remove() {

if(lastReturned == header)

throw new IllegalStateException("");

MyLinkedList.this.remove(lastReturned);

lastReturned = header;

listSize--;

}

}

//**************************************************************

private class MyListIterator extends MyIterator implements ListIterator {

private int nextIndex;

MyListIterator(int index) {

if(index < 0 || index > listSize)

throw new IndexOutOfBoundsException("");

//如果index小于listSize/2,就从表头开始查找定位,否则就从表尾开始查找定位

if(index < (listSize >> 1)) {

nextNode = header.next;

for(nextIndex = 0; nextIndex < index; nextIndex++)

nextNode = nextNode.next;

}else {

nextNode = header;

for(nextIndex = listSize; nextIndex > index; nextIndex--)

nextNode = nextNode.prev;

}

}

public boolean hasPrevious() {

return nextIndex != 0;

//return nextNode.prev != header;

}

public T previous() {

if (nextIndex == 0)

throw new NoSuchElementException("no");

lastReturned = nextNode = nextNode.prev;

nextIndex--;

return lastReturned.nodeValue;

}

public void remove() {

if(lastReturned == header)

throw new IllegalStateException("");

MyLinkedList.this.remove(lastReturned);

nextIndex--;

listSize--;

if(lastReturned == nextNode)

nextNode = nextNode.next;

lastReturned = header;

}

public void add(T item) {

MyLinkedList.this.addBefore(nextNode, item);

nextIndex++;

listSize++;

lastReturned = header;

}

public void set(T item) {

if (lastReturned == header)

throw new IllegalStateException();

lastReturned.nodeValue = item;

}

public int nextIndex() {

return nextIndex;

}

public int previousIndex() {

return nextIndex - 1;

}

}

//**************************************************************

public Iterator iterator() {

return new MyIterator();

}

//**************************************************************

public ListIterator listIterator(int index) {

return new MyListIterator(index);

}

//**************************************************************

public static void main(String[] args) {

MyLinkedList t = new MyLinkedList();

t.add("A");

t.add("B");

t.add("C");

t.add("D");

//t.remove("B");

//t.addFirst("AA");

//t.addLast("BB");

//t.printList();

/*

Iterator it = t.iterator();

while(it.hasNext()) System.out.println(it.next()); // A B C D

*/

ListIterator it = t.listIterator(t.size());

while(it.hasPrevious()) {

System.out.println(it.previous()); // D C B A

}

}

}// MyLinkedList end~

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2008-03-08 17:33

浏览 2918

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值