双向链接表其实就是在类里面做一个他自己的对象变量(地址载体用来指向下一个对象)
因为每个对象在创建时都是串地址值,地址值指向的是一个以类为表单(模板),以用户输入数据为内容的独一无二的表单,对象一般调用内容就是点一个成员方法或者成员变量,在链表里对象本身是一个节点,而成员变量是内容载体,成员对象是指向下一个对象的桥梁,只要明白这点其他都很好做,
链表本身是各个节点靠成员对象串起来的引用类型的丐版Arraylist,你要做的就是用它模仿arraylist的功能,比如遍历打印,修改,删除,添加,插入
链表第一个节点叫head,内容为空只是为了链接下一个起带头作用,最后一个链表的next也就是成员对象为null空指针
1.做节点也就是做对象要有个模子也就是类,这个类根据上文所说要有成员变量和成员对象,写个构造方法用参数来初始化这些成员的内容,
2.添加节点的方法,参数为你要添加的对象,先声明一个temp对象这个对象和next一样都只是为了承接地址,temp = head;然后不停temp = temp.next直到temp.next == null,然后把参数的对象(地址)赋值给temp.next
3.修改节点的方法,要修改你先得找到他,参数是索引,一般来说每一个节点都有个int 成员变量用来存放这是第几个节点,通过对这个进行比对可以知道是第几个节点,当然也可以写个for,用参数索引来控制temp跳转几次,找到以后就是对成员变量的修改
4.删除和插入,参数是索引和变量,需要提的就是temp.next.next这样的操作是合法的表示当前节点的下个节点的指向下个节点的成员对象(桥梁),删除其实就是把前一个节点桥梁通向后一个节点越过当前节点,插入就是反着来
5.遍历,一般来说直接打印对象结果是一串地址值,于是你要在节点的类里加上toString语句
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
这个语句作用是把类里的成员变量以字符的形式作为打印时的返回值,从而能打印节点里的内容,eclipse快捷键是alt + shift +s
不停跳转打印直到temp.next=null
把以上都做完就是个完整的单项链表,再给类加个指向前一个的成员对象,把方法都改一改加一加,使得从后往前操作也行,就是双向链表了
class HeroNode {
public int no;(数字编号
public String name;(节点的内容
public HeroNode next;(用来装下个节点的对象,
public HeroNode pre;(用来装下个节点的对象,
public HeroNode(int no,String name,String nickname) {(构造器初始化内容
this.no = no;
this.name = name;
this.nickname = nickname;
}
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
}
package singlelinked;
public class linked {
public static void main(String[] args) {
// TODO Auto-generated method stub
HeroNode hero1 = new HeroNode(1,"s","s");
HeroNode hero2 = new HeroNode(2,"b","b");
HeroNode hero3 = new HeroNode(3,"k","k");
HeroNode hero25 = new HeroNode(25,"25","25");
single dan = new single();
dan.ad(hero1);
dan.ad(hero2);
dan.ad(hero3);
dan.list();
dan.midad(hero25, 2);
dan.xiugai(2,"名字","小名", 2);
//正修改因为有个head所以索引是0开始
dan.list();
dan.delete(3);
dan.list();
dan.backlist();
dan.backxiugai(1,"倒数第一","倒数第一",2);
//反修改直接从最后一个开始所以索引是1开始
dan.backlist();
}
}
class single {
private HeroNode head = new HeroNode(0,"","");
public void delete (int index) {
HeroNode temp = head;
for(int i = 0;i<index;i++) {
temp = temp.next;
}
temp.pre.next = temp.next;
temp.next.pre = temp.pre;
}
public void xiugai (int no,String name,String nickname,int index) {
HeroNode temp = head;
for(int i = 0;i<index;i++) {
temp = temp.next;
}
temp.no = no;
temp.name = name;
temp.nickname = nickname;
}
public void backxiugai (int no,String name,String nickname,int backindex) {
HeroNode temp = head;
while(true) {
if(temp.next == null) {
break;
}
temp = temp.next;
}
for(int i = 1;i<backindex;i++) {
temp = temp.pre;
}
temp.no = no;
temp.name = name;
temp.nickname = nickname;
}
//这个是在索引之后加
public void midad (HeroNode heroNode,int index) {
HeroNode temp = head;
for(int i = 0;i<index;i++) {
temp = temp.next;
}
heroNode.next = temp.next;
temp.next = heroNode;
heroNode.pre = temp;
heroNode.next.pre = heroNode;
}
public void ad (HeroNode heroNode){
HeroNode temp = head;
while(true) {
if(temp.next == null) {
break;
}
temp = temp.next;
}
heroNode.pre = temp;
temp.next = heroNode;
}
public void list() {
if(head.next == null) {
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
System.out.println("前往后——————————————————");
while(true) {
if(temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
public void backlist() {
if(head.next == null) {
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
while(true) {
if(temp.next == null) {
break;
}
temp = temp.next;
}
System.out.println("后往前——————————————————");
while(true) {
if(temp == head) {
break;
}
System.out.println(temp);
temp = temp.pre;
}
}
}
class HeroNode {
public int no;
public String name;
public String nickname;
public HeroNode next;
public HeroNode pre;
public HeroNode(int no,String name,String nickname) {
this.no = no;
this.name = name;
this.nickname = nickname;
}
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
}