欢迎关注个人主页:逸狼
创造不易,可以点点赞吗~
如有错误,欢迎指出~
目录
双向不循环链表的定义
public class MyLinkedList {
static class ListNode{
public int val;
public ListNode next;
public ListNode prev;
public ListNode (int val){
this.val=val;
}
}
public ListNode head;//标志头节点
public ListNode last;//标志尾节点
}
包含key? 链表长度 打印链表
这里的方法实现与单链表的方法一样
//查找是否包含关键字key是否在单链表当中
public boolean contains(int key){
ListNode cur=head;
while(cur!=null){
if(cur.val==key){
return true;
}
cur=cur.next;
}
return false;
}
//得到单链表的长度
public int size(){
int count =0;
ListNode cur=head;
while(cur!=null){
cur=cur.next;
count++;
}
return count;
}
public void display(){
ListNode cur=head;
while(cur!=null){
System.out.print(cur.val+" ");
cur=cur.next;
}
System.out.println();
}
头插法 和 尾插法
注意第一次插入时:head=last=node
//头插法
public void addFirst(int data){
ListNode node=new ListNode(data);
if(head==null){
//第一次插入
head=last=node;
}else{
node.next=head;
head.prev=node;
head=node;
}
}
//尾插法
public void addLast(int data){
ListNode node =new ListNode(data);
if(head==null){
head=last=node;
}else{
last.next=node;
node.prev=last;
last=node;
}
}
任意位置插入
直接记录index位置的节点
修改4个指向
- node.next=cur;
- cur.prev.next=node;
- node.prev=cur.prev;
- cur.prev=node;
//任意位置插入,第一个数据节点为0号下标
public void addIndex(int index,int data){
try{
checkIndex(index);
}catch(IndexNotLegalException e){
e.printStackTrace();
}
if(index==0){
addFirst(data);
return;
}
if(index==size()){
addLast(data);
return;
}
ListNode cur=head;
int count=0;
while(count<index){
cur=cur.next;
count++;
}
ListNode node =new ListNode(data);
node.next=cur;
cur.prev.next=node;
node.prev=cur.prev;
cur.prev=node;
}
public class IndexNotLegalException extends RuntimeException{
public IndexNotLegalException(){
}
public IndexNotLegalException(String msg){
super(msg);
}
}
删除 值为key的节点
定义一个遍历节点cur
- cur.prev.next=cur.next;
- cur.next.prev=cur.prev;
注意删除特殊情况:
1.删除头节点时,cur.prev为空,会出现空指针异常
- head=head.next;
- head.prev=null;
2.删除尾节点时,cur.next为空,会出现空指针异常
- cur.prev.next=cur.next;
- last=last.prev;
//删除第一次出现关键字为key的节点
public void remove(int key){
ListNode cur=head;
while(cur!=null){
if(cur.val==key){
//处理头节点
if(cur==head){
head=head.next;
if(head!=null){
head.prev=null;
}else{
last=null;
}
}else {
//处理尾节点
if(cur.next==null){
cur.prev.next=cur.next;
last=last.prev;
//正常中间节点
}else{
cur.prev.next = cur.next;
cur.next.prev = cur.prev;
}
}
return;//删完一个就走
}
cur=cur.next;
}
}
删除 所有值为key的节点
上一个方法将return去掉
//删除所有值为key的节点
public void removeAllKey(int key){
ListNode cur=head;
while(cur!=null){
if(cur.val==key){
//处理头节点
if(cur==head){
head=head.next;
if(head!=null){
head.prev=null;
}else{
last=null;
}
}else {
//处理尾节点
if(cur.next==null){
cur.prev.next=cur.next;
last=last.prev;
//正常中间节点
}else{
cur.prev.next = cur.next;
cur.next.prev = cur.prev;
}
}
//return;//删完一个就走
}
cur=cur.next;
}
}
清空链表
public void clear(){
ListNode cur=head;
while(cur!=null){
ListNode curN=cur.next;
// cur.val=null;
cur.prev=null;
cur.next=null;
cur=curN;
}
head=last=null;
}