目录
单链表
链表都是通过节点来相互连接的,由于在java中没有指针的,所以java中是通过对象调对象来实现的
创建一个对象,并设置节点
class Node {
Object date;
Node next;
public Node(Object date) {
super();
this.date = date;
}
@Override
public String toString() {
return "Node [date=" + date + "]";
}
}
链表的增删改
增加
public Node head=new Node(null);//设置头结点
public void add(Node node){
Node temp=head; //让第一个节点为头结点
while(true){
if(temp.next==null){//如果循环之后节点的下一个节点为空,那么就是尾结点
break;
}
temp=temp.next;//指向下一个节点
}
temp.next=node;//把尾结点赋值
}
删除
public void delete(Object obj){
Node temp=head;
boolean flag=false;
while(true){
if(temp.next==null){
break;
}
if(temp.next.date.equals(obj)){
flag=true;
break;
}
temp=temp.next;
}
if(flag){
temp.next=temp.next.next;
}else{
System.out.println("要删除的节点不存在"+obj);
}
}
修改和添加类似,就是循环的时候节点的属性值等于输入的属性值就查到了这个节点并修改节点的数据
输入数据测试
public class SingleLinkedListTest{
public static void main(String[] args) {
singleLinkedList list=new singleLinkedList();
list.add(new Node("zs"));
list.add(new Node("zs2"));
list.list();
list.delete("zs");
list.list();
}
}
重写tostring
@Override
public String toString(){
StringBuilder sb=new StringBuilder();
Node temp=first;
sb.append("[");
while (temp.getNext()!=null) {
sb.append(temp.toString());
temp=temp.getNext();
}
sb.append("]");
return sb.toString();
}
双链表
双链表和单例表不同的是,双链表要设置一个前驱节点,也就是这个前驱节点要指向前一个节点,所以在增删改的时候不用再通过节点的下一个节点来指向了
创建一个双链表
package com.DoubleLinkedList;
public class Node {
private Object date;
private Node next;
private Node prv;
public Node(Object date, Node next, Node prv) {
super();
this.date = date;
this.next = next;
this.prv = prv;
}
public Object getDate() {
return date;
}
public void setDate(Object date) {
this.date = date;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node getPrv() {
return prv;
}
public void setPrv(Node prv) {
this.prv = prv;
}
@Override
public String toString() {
return "{date=" + date + "}";
}
}
双向链表的增删改
增加
public void add(Object obj){
Node newnod=new Node(obj,null,null);//同样的定义头结点
if(first==null){
first=newnod;//第一个节点就是头结点
}else {
Node temp=first;
while (temp.getNext()!=null) {//循环找到尾结点
temp=temp.getNext();//当前节点指向下一个节点
}
// 形成一个双向链表
temp.setNext(newnod);//添加数据,尾结点就是输入的数据
newnod.setPrv(temp);//同时设置添加数据的前置节点就是前一个节点
}
size++;//记录链表长度的
}
删除
public void delete(Object obj){
Node newnod=new Node(obj,null,null);
boolean flag=false;
if(first==null){
first=newnod;
}else{
Node temp=first.getNext();
// 因为是双链表所以直接找到该节点就行,不用通过下一个节点来删除
while(true){
if(temp==null){
break;
}
if(temp.getDate().equals(obj)){
flag=true;
break;
}
// 循环到下一个节点
temp=temp.getNext();
}
if(flag){
/*temp.setNext(temp.getNext().getNext());*/
temp.getPrv().setNext(temp.getNext());
size--;
}else{
System.out.println("要删除的节点不存在"+obj);
}
}
}
修改同上
重写tostring
@Override
public String toString(){
StringBuilder sb=new StringBuilder();
Node temp=first;
sb.append("[");
while (temp.getNext()!=null) {//相当于就是循环链表,然后打印每个节点的数据而已
sb.append(temp.toString());
temp=temp.getNext();
}
sb.append("]");
return sb.toString();
}