双端链表和双向链表
一. 双端链表
1. 什么是双端链表
链表中保存着对最后一个链结点的引用的链表
2. 从头部进行插入
要对链表进行判断,如果为空则设置尾结点为新添加的结点。
3. 从尾部进行插入
如果链表为空,则直接设置头结点为新添加的结点,否则设置尾结点的后一个结点为新添加的结点。
4. 从头部进行删除
判断头结点是否有下一个结点,如果没有则设置尾结点为null
链结点
/*
* 链结点,相当于是车厢
*/
public class Node {
//数据域:保存结点里的数据
public long data;
//结点域==指针域:保存下一个结点的引用
public Node next;
public Node(long value){
this.data=value;
}
/*
* 显示方法
*/
public void display(){
System.out.print(data+" ");
}
}
/*
* 双端链表
*/
public class FirstLastLinkList {
//头结点
private Node first;
//尾结点
private Node last;
public FirstLastLinkList(){
first=null;
last=null;
}
/*
* 插入一个结点,在头结点后进行插入
*/
public void insertFirst(long value){
Node node=new Node(value);
if(isEmpty()){
last=node;
}
node.next=first;
first=node;
}
/*
* 插入一个结点,从尾结点进行插入
*/
public void insertLast(long value){
Node node=new Node(value);
if(isEmpty()){
first=node;
}else{
last.next=node;
}
last=node;
}
/*
* 删除一个结点,在头结点后进行删除
*/
public Node deleteFirst(){
Node tmp=first;
if(first.next==null){
last=null;
}
first=tmp.next;
return tmp;
}
/*
* 显示方法
*/
public void display(){
Node current=first;
while(current!=null){
current.display();
current=current.next;
}
System.out.println();
}
/*
* 查找方法
*/
public Node find(long value){
Node current=first;
while(current.data!=value){
if(current.next==null){
return null;
}
current=current.next;
}
return current;
}
/*
* 删除方法,根据数据域进行删除
*/
public Node delete(long value){
Node current=first;
Node previous=first;
while(current.data!=value){
if(current.next==null){
return null;
}
previous=current;
current=current.next;
}
if(current==first){
first=first.next;
}else{
previous.next=current.next;
}
return current;
}
/*
* 判断是否为空
*/
public boolean isEmpty(){
return (first==null);
}
}
测试:
public class TestFirstLastLinkList {
public static void main(String[] args) {
// TODO Auto-generated method stub
FirstLastLinkList fl=new FirstLastLinkList();
fl.insertFirst(34);
fl.insertFirst(56);
fl.insertFirst(67);
// fl.insertFirst(76);
// fl.display();
//
// fl.deleteFirst();
// fl.deleteFirst();
// fl.display();
fl.insertLast(56);
fl.insertLast(90);
fl.insertLast(12);
fl.display();
}
}
二. 双向链表
1. 什么是双向链表
每个结点除了保存了对下一个结点的引用,同时还保存着对前一个结点的引用。
2. 从头部进行插入
要对链表进行判断,如果为空则设置尾结点为新添加的结点。如果不为空,还需要设置头结点的前一个结点为新添加的结点。
3. 从尾部进行插入
如果链表为空,则直接设置头结点为新添加的结点,否则设置尾结点的后一个结点为新添加的结点。同时设置新添加的结点的前一个结点为尾结点。
4. 从头部进行删除
判断头结点是否有下一个结点,如果没有则设置尾结点为null。否则设置头结点的下一个结点的previous为null。
5. 从尾部进行删除
如果头结点没有其他结点,则设置尾结点为null。否则设置尾结点前一个结点的next为null。设置尾结点为其前一个结点。
6. 删除方法
不需要再使用一个零时的指针域。
链结点
/*
* 链结点,相当于是车厢
*/
public class Node {
//数据域
public long data;
//结点域==指针域
public Node next;
public Node previous;
public Node(long value){
this.data=value;
}
/*
* 显示方法
*/
public void display(){
System.out.print(data+" ");
}
}
双向链表
/*
* 双向链表
*/
public class DoubleLinkList {
//头结点
private Node first;
//尾结点
private Node last;
public DoubleLinkList(){
first=null;
last=null;
}
/*
* 插入一个结点,在头结点后进行插入
*/
public void insertFirst(long value){
Node node=new Node(value);
if(isEmpty()){
last=node;
}else{
first.previous=node;
}
node.next=first;
first=node;
}
/*
* 插入一个结点,从尾结点进行插入
*/
public void insertLast(long value){
Node node=new Node(value);
if(isEmpty()){
first=node;
}else{
last.next=node;
node.previous=last;
}
last=node;
}
/*
* 删除一个结点,在头结点后进行删除
*/
public Node deleteFirst(){
Node tmp=first;
if(first.next==null){
last=null;
}else{
first.next.previous=null;
}
first=tmp.next;
return tmp;
}
/*
* 删除结点,从尾部进行删除
*/
public Node deleteLast(){
Node tmp=last;
if(first.next==null){
first=null;
}else{
last.previous.next=null;
}
last=tmp.previous;
return tmp;
}
/*
* 显示方法
*/
public void display(){
Node current=first;
while(current!=null){
current.display();
current=current.next;
}
System.out.println();
}
/*
* 查找方法
*/
public Node find(long value){
Node current=first;
while(current.data!=value){
if(current.next==null){
return null;
}
current=current.next;
}
return current;
}
/*
* 删除方法,根据数据域进行删除
*/
public Node delete(long value){
Node current=first;
while(current.data!=value){
if(current.next==null){
return null;
}
current=current.next;
}
if(current==first){
first=first.next;
}else{
current.previous.next=current.next;
}
return current;
}
/*
* 判断是否为空
*/
public boolean isEmpty(){
return (first==null);
}
}
测试:
public class TestDoubleLinkList {
public static void main(String[] args) {
// TODO Auto-generated method stub
DoubleLinkList dl=new DoubleLinkList();
dl.insertLast(45);
dl.insertLast(56);
dl.insertLast(90);
dl.display();
//
// dl.deleteLast();
// dl.display();
while(!dl.isEmpty()){
//dl.deleteLast();
dl.deleteFirst();
dl.display();
}
}
}