在以下的代码中,为了更加方便的插入,删除,以及提高效率,我将双端链表和双向链表结合了起来,代码如下:
package lianBiao;
/**
* 有头指针
* @author acer
*
*/
public class DoubleLinkList {
public static void main(String[] args) {
DoubleLinkList list=new DoubleLinkList();
list.addLast("aa");
list.addLast("aa");
list.addLast("bb");
list.addLast("bb");
// System.out.println(list.remove(0));
// System.out.println(list.remove(1));
// System.out.println(list.remove(2));
System.out.println(list.remove(3));
System.out.println(list.remove(4));
// System.out.println(list.removeFirst());
// System.out.println(list.removeFirst());
// System.out.println(list.removeFirst());
// System.out.println(list.removeFirst());
// System.out.println(list.removeLast());
// System.out.println(list.removeLast());
// System.out.println(list.removeLast());
// System.out.println(list.removeLast());
// list.clear1();
System.out.println("------");
System.out.println(list.size());
list.displayList();
}
private Link head;
private Link last;
public String remove(int index){
if(index<0){
return "index不能为负数";
}else if(index==0){
return removeFirst();
}else{
Link current=head;
int i=0;
while(current!=null && i<index){
current=current.next;
i++;
}
if(current==null){
return "index值过大";
}else if(current!=null&¤t.next==null){
return removeLast();
}else{
String data=current.data;
current.previous.next=current.next;
return data;
}
}
}
public String removeFirst(){
if(head!=null&&head.next!=null){
Link firstLink=getFirstLink();
String data=firstLink.data;
firstLink.next.previous=firstLink.previous;
head=firstLink.next;
return data;
}else if(head!=null&&head.next==null){
Link firstLink=getFirstLink();
String data=firstLink.data;
head=null;
last=null;
return data;
}
return null;
}
public String removeLast(){
Link current=head;
if(current!=null&¤t.next!=null){
Link lastLink=getLastLink();
String data=lastLink.data;
lastLink.previous.next=lastLink.next;
last=lastLink.previous;
return data;
}else if(current!=null &¤t.next==null){
String data=current.data;
head=null;
last=null;
return data;
}
return null;
}
//第一种方法,用删除头节点的方法
public void clear(){
Link current=head;
while(current!=null){
removeFirst();
current=current.next;
}
}
//第二种方法,用删除尾节点的方法
public void clear1(){
Link current=last;
while(current!=null){
removeLast();
current=current.previous;
}
}
public DoubleLinkList(){
head=null;
last=null;
}
public void addLast(String data){
Link newLink=new Link(data);
if(head==null){
last=newLink;
head=newLink;
}else{
Link temp=last;
temp.next=newLink;
newLink.previous=temp;
last=newLink;
}
}
public void displayList(){
Link current=head;
while(current!=null){
current.displayLink();
current=current.next;
}
}
public void addFirst(String data){
Link newLink=new Link(data);
if(head==null){
last=newLink;
head=newLink;
}else{
Link temp=head;
newLink.previous=temp;
newLink.next=temp;
temp.previous=newLink;
head=newLink;
}
}
public void add(int index,String data){
if(index<0){
System.out.println("index 不能为负数");
}else if(index==0){
addFirst(data);
}else{
Link current=head;
int i=0;
while(current!=null&&i<index-1){
current=current.next;
i++;
}
if(current==null){
System.out.println("index过大");
}else if(current.next==null){
addLast(data);
}else{
Link newlLink=new Link(data);
newlLink.next=current.next;
newlLink.previous=current;
current.next.previous=newlLink;
current.next=newlLink;
}
}
}
public boolean isEmpty(){
return head==null;
}
public void addLastAll(DoubleLinkList newList){//如何在不新建一个链表的基础上将两个链表连起来??
Link newFirst=newList.getFirstLink();
Link newLast=newList.getLastLink();
//将newFirst添加到原链表的尾部
last.next=newFirst;
newFirst.previous=last;
//改变last的指向
last=newLast;
// Link current=newList.head;
// Link temp=current;
// while(current!=null){
// Link last=this.last;
// last.next=temp;
// temp.previous=last;
// last=temp;
// current=current.next;
//
// }
}
public void addFirstAll(DoubleLinkList newList){
}
public Link getFirstLink(){
return head;
}
public Link getLastLink(){
return last;
}
public boolean contains(String data){
if(data==null){
return false;
}
Link current=head;
while(current!=null){
if(current.data.equals(data)){
return true;
}else{
current=current.next;
}
}
return false;
}
public String element(){//返回第一个元素的值
if(head==null){
return null;
}
return head.data;
}
public String get(int index){
if(index<0 ||index>size()){
return null;
}else{
int i=0;
Link current=head;
while(current!=null&&i<index){
current=current.next;
i++;
}
return current.data;
}
}
public String getFirst(){
return element();
}
public String getLast(){
if(head==null){
return null;
}
return last.data;
}
public int indexOf(String data){
int i=0;
if(data==null){
return -1;
}else{
Link current=head;
while(current!=null){
if(current.data.equals(data)){
return i;
}else{
current=current.next;
i++;
}
}
if(current==null){
return -1;
}
}
return 0;
}
public int lastIndexOf(String data){
int answer;
if(data==null){
return -1;
}else{
Link current=last;
int index=size()-1;
while(current!=null&&index>=0){
if(current.data.equals(data)){
return index;
}else{
index--;
current=current.previous;
}
}
if(index<0){
return -1;
}
}
return 0;
}
public int size() {
Link current=head;
int size=0;
while(current!=null){
current=current.next;
size++;
}
return size;
}
class Link{
Link previous;
String data;
Link next;
Link(String data){
this.data=data;
}
public void displayLink(){
System.out.println(data+" ");
}
}
}