结构特点
class DListNode {
public int val;
public DListNode pre;
public DListNode next;
public DListNode(int val) {
this.val=val;
}
}
class DoubleList {
public DListNode head = null;
public DListNode last = null;//指向链表的尾巴
//增删查找
//头插法
public void addFirst(int data);
//尾插法
public void addLast(int data);
//任意位置插入,第一个数据节点为0号下标
public boolean addIndex(int index,int data);
//查找是否包含关键字key是否在单链表当中
public boolean contains(int key);
//删除第一次出现关键字为key的节点
public void remove(int key);
//删除所有值为key的节点
public void removeAllKey(int key);
//得到单链表的长度
public int size();
public void display();
public void clear(); }
}
1、头插法:
//先判断head是否为空
public void addFist(int val) {
DListNode node=new DListNode(val);
if(this.head==null) {
this.head=node;
this.last=node;
}else {
node.next=this.head;
this.head.pre=node;
this.head=node;
}
}
2、尾插法
``
//尾部插入也要判空
public void addLast(int val) {
DListNode node=new DListNode(val);
if(this.head==null) {
this.head=node;
this.last=node;
}else {
this.last.next=node;
node.pre=this.last;
this.last=node;
}
}
3、任意位置插入节点
//判断插入位置是否合法
//index<0||index>size()
//如果插入头部
if(index==0) {
addFirst(data);
}
//如果插入尾部
if(index==size()){
addLast(data);
}
//找到要插入位置的节点
private DListNode searchIndex(int index) {
if(index<0||index>getLength()) {
System.out.println("index不合法");
return null;
}
DListNode cur=this.head;
while(index>0){
cur=cur.next;
index--;
}
return cur;
}
public void addIndex(int index,int val) {
if(index==0) {
addFist(val);
return;
}
if(index==getLength()) {
addLast(val);
return;
}
DListNode cur=searchIndex(index);
if(cur==null) {
return;
}
DListNode node=new DListNode(val);
node.next=cur;
cur.pre.next=node;
node.pre=cur.pre;
cur.pre=node;
}
4、获取长度
public int getLength() {
DListNode cur=this.head;
int count=0;
while(cur.next!=null) {
cur=cur.next;
count++;
}
return count;
}
5、删除第一次出现关键字为key的节点并返回这个节点
public int remove(int val) {
int oldval=-1;
DListNode cur=this.head;
while(cur!=null) {
if(cur.val==val) {
oldval=cur.val;
if(head==cur) {
head=head.next;
this.head.pre=null;
return oldval;
}else {
cur.pre.next=cur.next;
if(cur!=this.last) {
cur.next.pre=cur.pre;
}else {
this.last=cur.pre;
}
return oldval;
}
}
cur=cur.next;
}
return -1;
}
6、删除出现所有关键字的节点
public void removeall(int val) {
int oldval=-1;
DListNode cur=this.head;
while(cur!=null) {
if(cur.val==val) {
oldval=cur.val;
if(head==cur) {
head=head.next;
this.head.pre=null;
}else {
cur.pre.next=cur.next;
if(cur!=this.last) {
cur.next.pre=cur.pre;
}else {
this.last=cur.pre;
}
}
}
cur=cur.next;
}
}
7、打印
public void show() {
DListNode cur=this.head;
while(cur!=null) {
System.out.print(cur.val+" ");
cur=cur.next;
}
System.out.println();
}
8、清空
public void clear() {
while(this.head!=null) {
DListNode cur=this.head;
this.head.next=null;
this.head.pre=null;
this.head=cur;
}
this.last=null;
}