双链表的几根实现及相关习题
节点类
class ListNode2 {//
public int data;
public ListNode2 prev;//前驱
public ListNode2 next;//后继
//new ListNode(10);
public ListNode2(int data) {
this.data = data;
}
}
class DoubleList {
public ListNode2 head;//头
public ListNode2 last;//尾巴
}
头插法
public void addFirst(int data) {
ListNode2 node = new ListNode2(data);
if (this.head==null){
this.head=node;
this.last=node;
}else{
node.next=this.head;
this.head.prev=node;
this.head=node;
}
}
尾插法
public void addLast(int data) {
ListNode2 node = new ListNode2(data);
if (this.head==null){
this.head=node;
this.last=node;
}else{
this.last.next=node;
node.prev=this.last;
this.last=node;
}
}
打印
//打印
public void display(){
ListNode2 cur=this.head;
if(this.head==null) {
return;
}
while (cur!=null){
System.out.print(cur.data+" ");
cur=cur.next;
}
System.out.println();
}
判断是否包含关键字key
public boolean contains(int key){
ListNode2 cur=this.head;
while (cur!=null){
if(cur.data==key){
return true;
}
cur=cur.next;
}
return false;
}
链表长度
//链表长度
public int getLength(){
ListNode2 cur=this.head;
int count=0;
while (cur!=null){
count++;
cur=cur.next;
}
return count;
}
查找index的位置
//查找index的位置
private ListNode2 searchIndex(int index) {
if(index<0||index>getLength()){
System.out.println("index位置不合法'");
return null;
}
ListNode2 cur=this.head;
while(index>0){
cur=cur.next;
index--;
}
return cur;
}
任意位置插入,第一个数据节点为0号下标
public void addIndex(int index,int data){
if(index==0){
addFirst(data);
return ;
}
if (index==getLength()){
addLast(data);
return ;
}
ListNode2 cur=searchIndex(index);
if (cur==null){
return ;
}
ListNode2 node=new ListNode2(data);
node.next=cur;
cur.prev.next=node;
node.prev=cur.prev;
cur.prev=node;
}
删除第一次出现的关键字key
返回要删除的节点的下标
public int remove(int key){
int oldData=-1;
ListNode2 cur=this.head;
while (cur!=null){
if(cur.data==key){
oldData=cur.data;
if(cur==this.head){
//头
this.head=this.head.next;
this.head.prev=null;
return oldData;
}else {
cur.prev.next = cur.next;
if (cur!=this.last){
cur.next.prev = cur.prev;
}
else {
this.last=cur.prev;
}
return oldData;
}
}
cur=cur.next;
}
return -1;
}
删除所有值为key的节点
public void removeAllKey(int key){
ListNode2 cur=this.head;
while (cur!=null){
if(cur.data==key)
if(cur==this.head){
//头
this.head=this.head.next;
this.head.prev=null;
}else {
cur.prev.next = cur.next;
if (cur!=this.last){
cur.next.prev = cur.prev;
}
else {
this.last=cur.prev;
}
}
}
cur=cur.next;
}
清空单链表
public void clear(){
while (this.head!=null){
ListNode2 cur=this.head.next;
this.head.next=null;
this.head.prev=null;
this.head=cur;
}
this.last=null;
}