双向链表DoubleLinkList
双向链表就是单链表的改进,添加了一个“pre”域,但是这个新的域指向的是上一个结点。

对单链表遗忘的,可以和我的上一篇文章单链表结合起来看。
双向链表的删除和插入需要考虑的情况会多点。因为多了个pre域,很容易在头部或者尾部进行插入和删除的时候,报空指针异常。
java:实现带头结点的双向链表。
package com.study;
public class TestDoubleLinkList {
public static void main(String[] args) {
DoubleLinkList doubleLinkList = new DoubleLinkList();
doubleLinkList.addNodeHead(1);
System.out.println("打印链表信息");
doubleLinkList.printDouleLinkList();
doubleLinkList.addNodeTail(10);
System.out.println("打印链表信息");
doubleLinkList.printDouleLinkList();
doubleLinkList.delete(2);
System.out.println("打印链表信息");
doubleLinkList.printDouleLinkList();
System.out.println("当前长度");
System.out.println(doubleLinkList.length());
}
}
class Node {
int data;
Node next = null;//指向下一结点
Node pre = null;//指向上一结点
public Node(int data){
this.data = data;
}
}
//定义双向链表
class DoubleLinkList{
Node head = new Node(0);//头结点
/*
* 在表头插入结点
* 还有人会有疑惑,
* 这里的表头是在头结点往后的第一个位置插入,并不是在头结点前面插入,
* 不清楚的可以看我的上一篇文章,地址在文章前面
* */
public void addNodeHead(int data){
Node newNode = new Node(data);
Node temp = head;
if(temp.next==null){//此处需要注意下,要判断是不是空链表,不然去掉这个if部分的代码块会出现空指针异常
newNode.pre = temp;
temp.next = newNode;
}else{//链表不为空
newNode.next = temp.next;
newNode.pre = temp;
temp.next.pre = newNode;
temp.next = newNode;
}
}
/*
* 在尾部插入结点
* */
public void addNodeTail(int data){
Node newNode = new Node(data);
Node temp = head;
while(temp.next!=null){
temp = temp.next;
}
temp.next = newNode;
newNode.pre = temp;
}
/*
* 删除第index个结点
* */
public boolean delete(int index){
if(index>length() || index <= 0){
return false;
}
Node temp = head.next;
int i = 1;
while(temp.next!=null){//删除节点要注意,删除最后一个节点的时候,小心空指针异常,必须要考虑
if(i==index){
temp.next.pre = temp.pre;
temp.pre.next = temp.next;
return true;
}
temp = temp.next;
i++;
}
temp.pre.next = null;
temp.pre = null;
return true;
}
/*
* @return:链表的长度
* */
public int length(){
Node temp = head;
int length = 0;
while(temp.next!=null){
length++;
temp = temp.next;
}
return length;
}
/*
* 遍历
* */
public void printDouleLinkList(){
Node temp = head;
if(temp.next==null){
System.out.println("链表为空");
}
while(temp.next!=null){
temp = temp.next;
System.out.println(temp.data);
}
}
}
java实现不带头结点的双向链表
package com.study;
public class TestDoubleLinkList {
public static void main(String[] args) {
DoubleLinkList doubleLinkList = new DoubleLinkList();
doubleLinkList.addNodeHead(1);
System.out.println("打印链表信息");
doubleLinkList.printDouleLinkList();
doubleLinkList.addNodeTail(10);
System.out.println("打印链表信息");
doubleLinkList.printDouleLinkList();
doubleLinkList.delete(2);
System.out.println("打印链表信息");
doubleLinkList.printDouleLinkList();
System.out.println("当前长度");
System.out.println(doubleLinkList.length());
}
}
//定义双向链表
class DoubleLinkList{
Node head = null;//链表头的引用
/*
* 表头插入
* */
public void addNodeHead(int data){
Node newNode = new Node(data);
if(head == null){
head = newNode;
return;
}
newNode.next = head;
head.pre = newNode;
}
/*
* 尾部插入
* */
public void addNodeTail(int data){
Node newNode = new Node(data);
if(head == null){
head = newNode;
}
Node temp =head;
while(temp.next!=null){
temp = temp.next;
}
temp.next = newNode;
newNode.pre = temp;
}
/*
* 删除第index位置的结点
* */
public boolean delete(int index){
if(index<=0 || index>length()){
return false;
}
Node temp =head;
if(index==1 && length()==1){
head = head.next;
return true;
}else if(index ==1 && length()>1){
head = temp.next;
temp.next = null;
return true;
}
if(index==2 && length()==2){
temp.next.pre = null;
temp.next = null;
return true;
}
int i = 2;
Node curNode = head.next;
while(curNode.next!=null){
if(i==index){
curNode.next.pre = curNode.pre;
curNode.pre.next = curNode.next;
curNode.pre = null;
curNode.next = null;
return true;
}
curNode = curNode.next;
i++;
}
curNode.pre.next = null;
curNode.pre = null;
return true;
}
/*
* 链表的长度
* */
public int length(){
Node temp = head;
int length = 0;
while(temp!=null){
length++;
temp = temp.next;
}
return length;
}
/*
* 遍历
* */
public void printDouleLinkList(){
Node temp =head;
if(temp==null){
System.out.println("链表为空");
}
while(temp!=null){
System.out.println(temp.data);
temp = temp.next;
}
}
}
本文详细介绍双向链表的Java实现,包括带头结点和不带头结点的双向链表,涉及插入、删除、遍历等操作。通过具体代码示例,深入解析双向链表的构造与维护。
:双向链表DoubleLinkList,带头结点和不带头结点的实现方法&spm=1001.2101.3001.5002&articleId=105646682&d=1&t=3&u=1d30f6cbe21546d6867f258b5b7049a0)
1228

被折叠的 条评论
为什么被折叠?



