双端链表:
链表中的链接点: 节点:同时具有了 向前、向后的引用
同时具有 first 、last 节点
链表最后一个链节点特点: next = null;
链表第一个链接点特点: previous = null;
链表 只有一个节点特点: first.next = null 或者 last.previous = null
特点:
遍历支持 向前、向后遍历
package doublyLinked;
class Link{
int iData;
Link next;
Link previous;
public Link(int iData){
this.iData = iData;
}
public void displayLink(){
System.out.print("{"+iData+"} ");
}
}
public class DoublyLinked {
private Link first;
private Link last;
public DoublyLinked(){
first = null;
last = null;
}
public boolean isEmpty(){
return first == null;
}
public void insertFirst(int iData){
Link newLink = new Link(iData);
if(isEmpty()){
last = newLink;
}else{
first.previous = newLink; //原先的first
newLink.next = first;//* position1 这条语句放到positon1、position2 效果一样
}
//newLink.next = first;//position2
first = newLink;
}
public void displayForward(){
Link current = first;
while(current != null){
current.displayLink();
current = current.next;
}
}
public void deleteFirst(){
if(isEmpty()){
return;
}
if(first.next == null){//如果只有一个元素
last = null;
}else{
first.next.previous = null;// 第一个节点 previous ==null;
}
first = first.next;
}
public void deleteLast(){
if(isEmpty()){
return;
}
if(first.next ==null){// 同deleteFirst() 中一样
first = null;
}else{
last.previous.next = null;//最后一个节点next =null;
}
last = last.previous;
}
public void deleteKey(int key){
if(isEmpty()){
return;
}
Link current = first;
while(current.iData != key){
current = current.next;
if(current ==null){//到最后一个节点了
return;
}
}
if(current == first){
first = current.next;
}else{
current.previous.next = current.next;
}
if(current == last){
last = current.previous;
}else{
current.next.previous = current.previous;
}
}
public void displayBack(){
Link current = last;
while(current != null){
current.displayLink();
current = current.previous;
}
}
public void insertLast(int iData){
Link newLink = new Link(iData);
if(isEmpty()){
first = newLink;
}else{
last.next = newLink;
newLink.previous = last;
}
last = newLink;
}
public boolean inserAfter(int key,int iData){
Link current = first;
while(current.iData != key){
current =current.next;
if(current == null){//没有找到key 对应的值
return false;
}
}
Link newLink = new Link(iData);
if(current == last){
newLink.next = null;
last = newLink;
}else{
newLink.next = current.next;
current.next.previous = newLink;
}
newLink.previous = current;//
current.next = newLink;//
return true;
}
public static void main(String [] args){
DoublyLinked links = new DoublyLinked();
links.insertFirst(12);
links.insertFirst(33);
links.insertFirst(80);
links.deleteKey(33);
links.displayForward();
System.out.println("--------------");
links.displayBack();
}
}
class Link{
int iData;
Link next;
Link previous;
public Link(int iData){
this.iData = iData;
}
public void displayLink(){
System.out.print("{"+iData+"} ");
}
}
public class DoublyLinked {
private Link first;
private Link last;
public DoublyLinked(){
first = null;
last = null;
}
public boolean isEmpty(){
return first == null;
}
public void insertFirst(int iData){
Link newLink = new Link(iData);
if(isEmpty()){
last = newLink;
}else{
first.previous = newLink; //原先的first
newLink.next = first;//* position1 这条语句放到positon1、position2 效果一样
}
//newLink.next = first;//position2
first = newLink;
}
public void displayForward(){
Link current = first;
while(current != null){
current.displayLink();
current = current.next;
}
}
public void deleteFirst(){
if(isEmpty()){
return;
}
if(first.next == null){//如果只有一个元素
last = null;
}else{
first.next.previous = null;// 第一个节点 previous ==null;
}
first = first.next;
}
public void deleteLast(){
if(isEmpty()){
return;
}
if(first.next ==null){// 同deleteFirst() 中一样
first = null;
}else{
last.previous.next = null;//最后一个节点next =null;
}
last = last.previous;
}
public void deleteKey(int key){
if(isEmpty()){
return;
}
Link current = first;
while(current.iData != key){
current = current.next;
if(current ==null){//到最后一个节点了
return;
}
}
if(current == first){
first = current.next;
}else{
current.previous.next = current.next;
}
if(current == last){
last = current.previous;
}else{
current.next.previous = current.previous;
}
}
public void displayBack(){
Link current = last;
while(current != null){
current.displayLink();
current = current.previous;
}
}
public void insertLast(int iData){
Link newLink = new Link(iData);
if(isEmpty()){
first = newLink;
}else{
last.next = newLink;
newLink.previous = last;
}
last = newLink;
}
public boolean inserAfter(int key,int iData){
Link current = first;
while(current.iData != key){
current =current.next;
if(current == null){//没有找到key 对应的值
return false;
}
}
Link newLink = new Link(iData);
if(current == last){
newLink.next = null;
last = newLink;
}else{
newLink.next = current.next;
current.next.previous = newLink;
}
newLink.previous = current;//
current.next = newLink;//
return true;
}
public static void main(String [] args){
DoublyLinked links = new DoublyLinked();
links.insertFirst(12);
links.insertFirst(33);
links.insertFirst(80);
links.deleteKey(33);
links.displayForward();
System.out.println("--------------");
links.displayBack();
}
}
本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/229659,如需转载请自行联系原作者