无头双向链表基本操作:头插法,尾插法,删除key…
//构造无头双向链表
class ListNode {
public int data;
public ListNode next;
public ListNode prev;
public ListNode(int data) {
this.data=data;
this.next=null;
}
}
public class DoubleList {
public ListNode head;
public ListNode last;//尾巴
//1,头插法
public void addFirst(int data) {
ListNode node = new ListNode(data);
//第一次插入
if(this.head==null) {
this.head=node;
this.last=node;
}
//不是第一次插入
else {
node.next=this.head;
this.head.prev=node;
this.head=node;
}
}
//2,尾插法
public void addLast(int data) {
ListNode node = new ListNode(data);
//第一次插入
if(this.head==null) {
this.head=node;
this.last=node;
}
//不是第一次插入
else {
this.last.next=node;
node.prev=this.last;
this.last=node;
}
}
//3,任意位置插入
private ListNode searchIndex(int index) {
if(index<0 || index>size()) {
return null;
}
ListNode cur=this.head;
int count=0;
while(count < index-1) {
cur=cur.next;
count++;
}
return cur;
}
public boolean addIndex(int index,int data) {
if(index<0 || index>size()) {
return false;
}
if(index==0) {
addFirst(data);
return true;
}
if(index == size()) {
addLast(data);
return true ;
}
ListNode cur=searchIndex(index);
ListNode node=new ListNode(data);
if (cur == null) {
return false;
}
node.next=cur;
cur.prev.next=node;
node.prev=cur.prev;
cur.prev=node;
return true;
}
//4,查找是否包含关键字key节点
public boolean contains(int key) {
ListNode cur = this.head;
while(cur != null){
if(cur.data == key){
return true;
}
cur = cur.next;
}
return false;
}
//5,删除第一次出现的关键字key节点
//删除第一次出现关键字为key的节点
public void remove(int key){
ListNode cur = this.head;
while (cur != null) {
if(cur.data == key) {
//3种情况
if(cur == this.head) {
this.head = this.head.next;
this.head.prev = null;
}else {
//中间位置和尾巴
cur.prev.next = cur.next;
if(cur.next != null) {
cur.next.prev = cur.prev;
}else {
this.last = cur.prev;
}
}
return;
}
cur = cur.next;
}
}
//6,删除所有key节点
public void removeAllKey(int key) {
ListNode 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;
//cur.next != null表示删除的不是尾节点
if(cur.next != null){
cur.next.prev = cur.prev;
}else{
//尾节点删除,last需要移动
this.last = cur.prev;
}
}
}
cur = cur.next;
}
}
//7,清空
public void clear() {
ListNode cur=this.head;
while(this.head != null) {
ListNode cur1=this.head.next;
this.head.next=null;
this.head.prev=null;
this.head=cur1;
}
this.last=null;
}
//获取长度
public int size() {
int count=0;
ListNode cur=this.head;
while(cur != null) {
count++;
cur=cur.next;
}
return count;
}
//打印
public void display() {
ListNode cur=this.head;
while(cur != null) {
System.out.print(cur.data+" ");
cur=cur.next;
}
System.out.println();
}
}