双向链表节点的定义
public class doubleListNode {
int val; //数据项
doubleListNode prev; //定义前向指针,指向节点的前一个节点
doubleListNode next; //定义后向指针,指向节点的后一个节点
public doubleListNode(int x){
val=x;
} //构造器,使之能够将输入的int型数字变成一个节点型数字
}
双向链表的一些功能
初始化链表
/**初始化链表**/
private doubleListNode head;
private doubleListNode last;
public MyDoubleLink() {
head=null;
last=null;
}
在头结点添加链表元素
/* 在头结点添加元素 */
public void addAtHead(int val) {
doubleListNode cur=new doubleListNode(val);
if(isEmpty()) {//判断链表是否为空
last=cur;
}//如果是空链表,则last字段需要特殊处理
else {
head.prev=cur; //cur<-- old head
}
cur.next=head; //cur-->old head
head=cur;
}
/* 判断是否是空链表 */
public boolean isEmpty() {
return (head==null);
}
在尾节点添加元素
/* 在尾节点添加元素 */
public void addAtTail(int val) {
doubleListNode cur=new doubleListNode(val);
if(isEmpty()) {
head=cur; //头结点需要单独处理
}else {
last.next=cur; //old last-->cur
}
cur.prev=last; //old last<--cur
last=cur;
}
在链表中间添加元素
假设:原始链表:1—>2
则: addAtIndex(-1,0): 0—>1—>2
addAtIndex(4,0): 0—>1—>2—>3
addAtIndex(2,0): 0—>1—>0—>2—>3
/* 在索引index之前添加节点
* 1、如果index<0,则在头结点之前添加
* 2、如果index>链表长度,则在链表末尾添加
* 3、如果1<index<=链表长度,则在索引之前添加元素
* */
public void addAtIndex(int index,int val) {
int j=getNumber();
if(index<0||index==0) { //满足条件1,在链表头部添加元素
addAtHead(val);
}else if(index>j-1) { //满足条件2,在链表尾部添加元素
addAtTail(val);
}else { //条件3
doubleListNode p=head;
doubleListNode cur=new doubleListNode(val);
for(int i=0;i<index-1;i++) {
p=p.next;
}
cur.next=p.next;
p.next.prev=cur;
cur.prev=p;
p.next=cur;
}
}
删除链表中的元素
deleteIndex(index):
当索引值index不是有效值时,则不进行删除。解决办法:直接return返回
/* 删除索引index对应的节点
* (只有index有效的时候才进行删除)
* 解决办法:当index无效的时候,直接返回
* */
public void deleteAtIndex(int index) {
int j=getNumber();
if(index<0||index>j-1) {//index无效时
return;
}else if(index==0){ //删除头节点时
head=head.next;
}else if(index==j-1) { //删除尾节点时
last.prev.next=last.next; // 尾节点之前的一个节点的next字段需要改变
last=last.prev; //尾节点需要改变
}
else {
doubleListNode p=head;
for(int i=0;i<index;i++) {
p=p.next;
}
p.prev.next=p.next;
p.next.prev=p.prev;
}
showLinkedList();
}
获取索引值index对应的链结点的值
当index超出链表范围时,返回-1
/* 返回索引index对应的元素值 */
public int get(int index) {
int j=getNumber(); //获取链表长度
if(index<0||index>j-1) {
return -1;
}
else {
doubleListNode p=head;
for(int i=0;i<index;i++) {
p=p.next;
}
int b=p.val;
return b;
}
}
获取链表的长度
/* 获取链表长度 */
public int getNumber() {
doubleListNode p=head;
int i=1;
//遍历链表
while(p!=null&&p.next!=null) {
p=p.next;
i++;
}
int a=i;
return a;
}
将链表中的元素输出
/* 展示链表 */
public void showLinkedList() {
doubleListNode p=head;
System.out.print("first->last:");
while(p!=null) {
System.out.print(p.val+"");
p=p.next;
}
}
来源:CSDN
作者:稳稳的文雯
链接:https://blog.csdn.net/weixin_44237988/article/details/103470424