Java数据结构之单链表

目录

一、链表存储方式

二、创建节点类Node

三、重写 toString( ) 方法

四、创建链表类用来管理节点

创建链表类

有顺序添加节点

删除相应位置节点

 显示链表信息

查找单链表中第k个节点


一、链表存储方式

  • 用一组任意的存储单元存储信息,存储单元可以连续也可以不连续。信息之间是一对一的关系。
  • 各个节点之间构成链表。
  • 节点由数据域和指针域构成。
  • 数据域存储数据,指针域存放下一个节点的地址。next 域实质为Node对象

  •  链表由带头节点的和不带头节点的。下图为带节点的

二、创建节点类Node

每一个Node 类对象就是一个节点。

class Node{
    public String name;//数据域
    public String nickname;//数据域
    public int node;//数据域
    public Node next;//指针域
    
    public Node(String name, String nickname, int node) {
        this.name = name;
        this.nickname = nickname;
        this.node = node;
    }
    //重写toString()方法
    @Override
    public String toString() {
        return "Node [name=" + name + ", nickname=" + nickname + ", node=" + node + "]";
    }
    

三、重写 toString( ) 方法

为什么要重写 toString() 方法?每个类都从Object 类继承了 toString () 方法,并且返回的是一个内存地址。重写 toString() 方法,可以打印类中的信息。

例:创建一个people 类,类中有 age,name,nickname 三个成员变量。重写toString() 方法,可以返回类中age, name ,nickname 的信息。

package day_04;

//在没有重新toString()方法时,如果打印对象,则打印的是地址
//如果重写该方法,则打印的是该对象的信息

public class ToString {
    public static void main(String[] args) {
        Teacher teacher = new Teacher(20,"huahua");
        teacher.print(teacher);    
    }
}

class Teacher{
    private int age;
    private String name;
    public Teacher(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Teacher [age=" + age + ", name=" + name + "]";
    }

    public void print(Teacher a) {
        System.out.print(a);
    }

}
 

}

四、创建链表类用来管理节点

  • 创建链表类

//创建链表类用来管理链表
class LinkedList{

	//初始化头节点
	Node head = new Node("","",0);

}
  • 有顺序添加节点

//向链表中有顺序添加节点
    /*
     * 思路:遍历,找到需要添加的节点所在位置
     * 创建中间变量
     * 结束条件为:temp.next.node > newNode.node
     * 如果编号已经存在,则提示编号已经存在
     * 需要改变的条件为newNode.next = temp.next;temp.next = newNode
     */

public void addByOrder(Node newNode){
        
        Node temp = head;
        boolean flag = false;//编号是否存在
        while(true) {
            if(temp.next.node>newNode.node) {
                break;
            }
            if(temp.next.node==newNode.node) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if(flag) {
            System.out.println("编号已经存在");
        }else {
            newNode.next = temp.next;
            temp.next = newNode;
        }
    }
  • 删除相应位置节点

//删除对应位置的节点
    /*
     * 思路:遍历链表,找到对应位置的节点
     * 创建中间变量temp,
     * 条件为:temp.next.node = newNode.node
     * 修改后的条件为:temp.next = temp.next.next
     * 
     */

public void del(Node newNode) {
		if(head.next == null) {
			System.out.println("链表为空,无法删除");
			return;
		}
		Node temp = head;
		boolean flag = false;
		while(true) {
			if(temp.next == null) {
				break;
			}
			if(temp.next.node == newNode.node) {
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if(flag) {
			//此时已经找到对应位置
			temp.next = temp.next.next;
		}else {
			System.out.println("没有找到链表信息");
		}
		
	}

  •  显示链表信息

//显示链表信息
    /*
     * 遍历链表,创建中间变量temp
     * 遍历完的条件为temp == null
     */

public void show() {
		if(head.next == null) {
			System.out.println("链表为空");
			return;
		}
		Node temp = head.next;//从第一个开始
		while(true) {
			if(temp == null) {
				break;
			}
			System.out.println(temp);
			temp = temp.next;
		}
		
	}
  • 查找单链表中第k个节点

/*
     * 思路分析:count-k为所查找节点前一个节点位置,则后一个位置即为所求位置
     * 当temp.next不为null时,遍历,创建一个计数器,当计数器为count-k时,
     * 说明到达
     * temp.next即为对应节点
     */

public void  search(int k) {
		Node temp = head.next;
		int num = 0;
		boolean flag = false;
		while(temp.next!=null) {
			num++;
			if(num==(count()-k)) {
				flag = true;
				break;
			}
			temp = temp.next;
		}
		System.out.println(temp.next);
	}
  • 求单链表中节点个数

/*
     * 思路分析:若链表为空,则返回0,若不为空,则temp = head.next
     * 定义一个count计数,每次count+1,temp= temp.next,直到temp==null
     */

public int count() {
		if(head.next == null) {
			return 0;
		}
		Hero temp = head;
		int count = 0;
		while(true) {
			if(temp.next == null) {
				break;
			}
			count++;
			temp = temp.next;
		}
		return count;
	}

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值