千峰Java教程:071. 数据结构之链表①

19、数据结构之链表

链表(Linked List)一种常见的数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每个节点里存到是下一个节点的指针(Pointer)。

上面就是一个链表,这是一个只有一个链表的链表,左边大的区域储存链表里面的信息,右边小区域是指针,有null和指向下一个链表的指针。像下面这样:

我们再说一下这个链表:

按照百家姓前八个来说链表,我们知道,前八个是赵钱孙李,周吴郑王,我们从上面的图可以看到,它们的储存地址是不一样的,每一个数据与都不同,这就是链表,链表与数组不一样的地方就是数组是连续的一片区域,链表不需要。我们设定,头指针为61,可以看到,61的数据域就是赵,他的指针域是13,再看13,他的数据域是钱,指针域是25,接着看25,数据域是孙,指针域是1。最后排下来就是赵钱孙李周吴郑王了。

大家可以先看看给链表添加、显示全部的代码:

public class Demo1
{
	public static void main(String[] args)
	{
		NodeManager nm = new NodeManager();
		nm.add(5);
		nm.add(4);
		nm.add(3);
		nm.add(2);
		nm.add(1);
		nm.print();
	}
}

class NodeManager//这里创建一个链表
{
	private Node root;//这个是根节点,就是一开始的节点,就是图一,第一个点,并且是再链表内使用的要私有化,下面也是一样
	
	//下面就是内部类Node里面的方法了
	public void add(int data)
	{
		if(root == null)//添加的时候,如果刚开始的根节点为空
		{
			root = new Node(data);
		}
		else//如果不为空,就用内部类来传,因为root类型是Node,Node是有next指针的
		{
			root.addNode(data);//调用完这个方法,就进入了Node的addNode方法
		}
	}
	public void del(int data)
	{
		
	}
	public void print()
	{
		if(root != null)//说明根节点有东西
		{
			System.out.print(root.getData() + "->");
			root.printNode();//内部类调用
			System.out.println();
		}
	}
	public boolean find(int data)
	{
		return false;
	}
	public void update(int oldData, int newData)
	{
		
	}
	public void insertNode(int index, int data)
	{
			
	}
	
	private class Node//内部类,理解成根节点后面的节点吧
	{
		private int data;//这里建立的对象可以是int,也可以是其他对象
		private Node next;//这个就是这个Node的下一个链表,next指的就是下一个,把当前类型作为属性。
		
		/*好,表示我们已经知道怎么该表示了,但是我们该怎么操作这个链表呢?比如增删改查和插入等。那么这些方法应该是谁的呢?
		应该是这个内部类的,提一个原则:谁拥有数据,谁提供方法。这样,Node里面有数据(data),如果Node不提供方法,外部是
		不能访问的,就像是你要在家里关着门,别人是进不到家里面来的。*/
		
		//下面是构造方法和get set方法
		public Node(int data)
		{
			this.data = data;
		}
		public void setData(int data)
		{
			this.data = data;
		}
		public int getData()
		{
			return data;
		}
		
		//下面是增、删、输出、查询、修改、插入方法。这些方法只能是NodeManager来用,主函数不知道这些,这时候,就在NodeManager里也加上这些方法
		public void addNode(int data)
		{
			//第一步,传进来参数时,首先要看一看this.next是不是等于空(这个this指的是root传进来的this)
			if(this.next == null)
			{
				this.next = new Node(data);//后继有人
			}
			else//此时已经后继有人了
			{
				this.next.addNode(data);//这时候,说明后面还有对象,这样就用了一个递归,进入下一个addNode方法,进入下一个这个方法里面
			}
		}
		public void delNode(int data)
		{
			
		}
		public void printNode()
		{
			if(this.next != null)//下一个节点不等于空
			{
				System.out.print(this.next.data + "->");
				this.next.printNode();
			}
		}
		public boolean findNode(int data)
		{
			return false;
		}
		public void updateNode(int oldData, int newData)
		{
			
		}
		public void insertNode(int index, int data)//index:要插入数据的位置
		{
			
		}
	}
}
/*
结果:
5->4->3->2->1->
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值