`
endual
  • 浏览: 3560999 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java 实现链表(自己写的)

 
阅读更多

今天用java写了下的链表, 还是有点糊涂的。这和C语言写的链表还是有点不太一样的。感觉C语言的结构清晰点的,可能是内存中保存的值是引用还是真的值有关系吧有两点要说明下的:

1、Head --> Node --> Node --> Node --> Node

     链表的head是不保存数据的,一般开辟内存然后在里面放null空对象。保存值从第一个Node开始的。C语言好像也是这样的吧


2. 下面的程序我到是测试了下,平时过过面试笔试的关是没有问题了。但是有的地方还是需要再分析下的。


实现了增加删除显示


下面是步骤

 

创建People类,这个就相当于我们放入到链表中的数据

package endual;

public class People {

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

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	
	
	
	
}
 

步骤二:创建Node节点

 

package endual;

public class Node {



	private People people = new People(0,"head",0);
	private Node nextNode ;
	
	public Node(People people,Node nextNode) {
		super();
		this.people = people ;
		this.nextNode = nextNode ;
	}
	
	//显示该节点的数据
	public void display() {
		
		System.out.println(people.getId() +"--" +
		                   people.getName() +"--" +
				           people.getAge()) ;
		
	}
	
	public People getPeople() {
		return people;
	}

	public void setPeople(People people) {
		this.people = people;
	}

	public Node getNextNode() {
		return nextNode;
	}

	public void setNextNode(Node nextNode) {
		this.nextNode = nextNode;
	}
	
	
	
}
 

需要说明的是一个节点,中是保护一个数值和下一个节点

 

步骤三:

 

链表的实现

 

package endual;



/**
 * 最重要的说明,head节点是不保存people数据的只是一个头节点,保存数据是从head的下一个节点开始的
 * @author Endual
 *
 */
public class LinkList {
	
	//链表的头节点是很重要的,寻找到头节点就能做删除插入等操作了
	
	private Node head  ; 
	private int nItems = 0 ; //链表的数据个数有多少个,初始化是0
	
	public LinkList() {
		
		this.head = new Node(null,null) ; //这里必须开辟对象,将head指向一个对象
	}
	
	//判断是否为空
	public boolean isEmply() {
		
		if(this.nItems==0) {
			return true ;
		}
		return false ;
		
	}
	

	// * 链表的长度

	public int size() {
		
		return this.nItems ;
		
	}
	
	//插入一个node到链表的尾部                                                                                               

	public void insertTail(People people) { //传递进来的就是新的node 
	   // Head(头节点的数据是没有的) --> Node(保存数据从这里开始) --> Node --> Node --> FirstNode
	   // 相当于Node node = new Node(new People) ;
		Node node = new Node(people,null) ; //创建一个新的Node的链表节点,其中数据是传入进来的people,下一个节点是null
		
		Node temp = head ; //创建了一个中间变量,中间变量的变化就是head的变化
		
		while (null != temp.getNextNode()) {
			
			temp = temp.getNextNode() ;
			
		}
		
		temp.setNextNode(node) ; //一般而言是从第二个节点才开始放数据的,所以头节点是的node是NULL
		this.nItems++ ;
		
         
       
	}
	
	//插入一个node到一个链表的头部
	public void insertHead(People people) { //将新插入的node节点作为第一个显示的节点
		
		Node node = new Node(people,null) ; //将要被插入的节点
	
      	node.setNextNode(head.getNextNode()) ; //插入节点的下一个节点是head指向的下一个节点
      	
      	head.setNextNode(node) ; //head指向的下一个节点改变成为node
        
        this.nItems++ ; //插入数据将存放的个数加1;
		
	}
	
	//根据标号来插入数据 从0开始 
	
	public void insert(int index, People people) {
		
		//判断插入的数据是否合法
		if(index < 0 || index > this.nItems) {
			System.out.println("插入的index错误") ;
			return ;
		}
		Node node = new Node(people,null) ; //将要被插入的节点
		Node temp = head ;
		for (int i=0; i < index; i++) {
			temp = temp.getNextNode() ; //这个就是第index个节点的前一个节点,查在这个位子,这个位子要向
		}
		node.setNextNode(temp.getNextNode()) ;
		temp.setNextNode(node) ;
		this.nItems++ ;
	}
	
	//根据位子来查找数据
	
	public People find(int index) {
	
		if (index < 0 ) {
			
			System.out.println("查找的index位子不能小于0");
			return null;
			
		}
		
		if (index+1 > this.nItems) {
			
			System.out.println("查找的位子大于链表的长度了");
			return null;
			
		}
		
		
		Node temp = head ;
		for (int i=0; i <= index; i++) {
			
			temp = temp.getNextNode() ;
			
		}
		
		return temp.getPeople();
		
	}
	
	//根据位子删除
	public void delete(int index) {
		
        if (index<0 || index > this.nItems) {
        	
        	System.out.println("index数据或大或小");
        	return ;
        	
        }
        
        /**
         * 说明
         * index = 0 , 删掉第一个,找到head
         * index = 1 , 删掉第二个,找到第一个
         * index = 2 , 删掉第三个,找到第二个
         */
        
		Node temp = head ;
		for (int i=0; i < index; i++) {
			
			temp = temp.getNextNode() ;
		}
		
		temp.setNextNode(temp.getNextNode().getNextNode()) ;
		this.nItems-- ;
		
		
	}
	//删除结尾
	public void delectTail() {
		
		if(this.nItems==0) {
			
			System.out.println("当前链表为空") ;
			return ;
			
		}
		Node temp = head ;
		for (int i=0; i < this.nItems-1; i++) {
			temp = temp.getNextNode() ;
		}
		temp.setNextNode(null) ;
		this.nItems-- ;
	}
	
	
	//删除头
	public void deleteHead(){
       
		if(this.nItems==0) {
			System.out.println("当前链表为空") ;
			return ;
		}
		
		Node temp = head ;
		head.setNextNode(temp.getNextNode().getNextNode()) ;
		this.nItems-- ;
		
	}
	
	/**
	 * 显示链表
	 */
	public void display() {
		

		Node current = head ;
		
		if (this.nItems == 0) {
			System.out.println("当前链表为空") ;
			return ;
		}
		//while中用node节点的下一个节点是否为空
		while (current.getNextNode() != null) { //在while中如果第一次是null那么说明是这个链表还没有数据
			
			current = current.getNextNode() ; //将当前节点移动到下一个节点
			current.display() ; //显示当前节点
		}
		
		
	}
	
	
}
 

步骤四 :测试类的实现

 

package endual;

public class Mian {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		People p1 = new People(1, "n1", 1) ;
		People p2 = new People(2, "n2", 2) ;
		People p3 = new People(3, "n3", 3) ;
		People p4 = new People(4, "n4", 4) ;
		People p5 = new People(5, "n5", 5) ;
		People p6 = new People(6, "n6", 6) ;
		People p7 = new People(7, "n7", 7) ;
		
		LinkList lk = new LinkList() ;
		lk.display() ;
	
		lk.insertTail(p1) ;
		lk.insertTail(p2) ;    
		lk.insertTail(p3) ;
		lk.insertTail(p4) ;
		lk.insertTail(p5) ;
		lk.insertTail(p6) ;
		lk.insertTail(p7) ;
		lk.display() ;
		
//		System.out.println(lk.find(0).getId()) ;
//		System.out.println(lk.find(1).getId()) ;
//		System.out.println(lk.find(2).getId()) ;
//		System.out.println(lk.find(3).getId()) ;
//		System.out.println(lk.find(4).getId()) ;
//		System.out.println(lk.find(5).getId()) ;
//		System.out.println(lk.find(6).getId()) ;
//		System.out.println(lk.find(7).getId()) ;
		
		lk.delete(0) ;lk.delete(3) ;
		lk.display() ;
		
		
	}

}

 需要说明的是 测试类可以自己写 。

 

希望对面试啊 笔试啊 有好处吧。

 

我非常愿意与你交流关于面试笔试已经学习基础的数据结构和算法的问题。因为本人现在在复习这个。

我的QQ:1019990976 麻烦注明:数据结构

 

 

 

分享到:
评论

相关推荐

    java实现链表操作

    用java实现了数据结构中的链表,作为新手学习数据结构和java的资料。

    JAVA实现链表_双向链表

    JAVA实现链表_双向链表

    Java实现双向链表

    用Java定义一个双向链表,实现链表的基本操作: 初始化、获取头结点、添加新元素、删除链表元素、 获取链表元素、查找链表元素、更新链表中某个元素、 判断链表是否为空、求链表元素个数、输出链表元素、清空链表。

    java 实现倒序链表

    接下来,我们需要编写一个方法来实现链表的倒序。该方法接收链表的头结点作为参数,并返回倒序后的新的头结点。实现的逻辑大致分为以下几个步骤: 1. 初始化三个指针:`p`、`q`和`head`。 2. 使用循环逐个反转节点的...

    JAVA双向链表反转实现

    以下是使用迭代方式实现双向链表反转的Java代码: ```java public void reverse() { if (head == null || head.next == null) { return; } Node current = head; Node previous = null; while (current != ...

    链表用java实现,弥补java的无指针的缺点

    虽然Java没有像C或C++那样的指针,但是通过对象引用,我们完全可以在Java中实现链表数据结构。这种实现方式不仅安全,而且易于理解和操作。通过链表,我们可以高效地处理动态数据集,执行插入、删除等操作,而无需...

    java 单链表和双向链表的实现

    本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...

    Java SE程序 类实现单向链表

    Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现...

    java链表实现约瑟夫问题

    约瑟夫问题,通过类实现的链表,并加以改进,做成双向链表

    Java 单向链表 插入与删除节点

    这是一个单向链表,它具有插入与删除节点的功能。Entry类实现了链表的各节点。

    java实现链表.pdf

    Java 实现链表 在计算机科学中,链表是一种常用的数据结构,它允许在内存中存储和管理大量的数据。Java 语言提供了多种方式来实现链表,本文将详细介绍 Java 实现链表的方法和技巧。 链表的定义 链表是一种非线性...

    Java用链表实现的计算器程序.rar_JAVA计算器链表_计算器链表

    2. **链表类**:实现链表的基本操作,如添加节点、删除节点、遍历链表等。 3. **解析器**:将输入的数学表达式转换为链表结构。这可能涉及到字符串分割、运算符优先级判断等步骤。 4. **计算器引擎**:遍历链表并...

    Java实现循环链表

    用Java定义一个循环链表,实现链表的基本操作: 初始化*、获取头结点、添加新元素*、删除链表元素 、获取链表元素*、查找链表元素*、更新链表中某个元素、 判断链表是否为空、求链表元素个数、输出链表元素、清空...

    数据结构(java)实现链表

    数据结构,用Java实现链表 private class Node { private String data; private Node next; public Node(String dataPortioin) { data = dataPortioin; next = null; } public Node(String ...

    java编写的循环链表来实现约瑟夫环

    循环链表 实现约瑟夫环 java 自己写的 测试通过 有注释

    java实现链表增删改查

    用java实现链表增删改查

    用链表实现线性表java

    本篇将深入探讨如何用链表来实现线性表,并通过提供的`ChainList.java`和`ListInterface.java`文件来理解其实现细节。 首先,线性表具有顺序访问的特点,其元素可以通过索引进行访问。链表是一种非连续存储结构,每...

    试析用Java实现链表数据结构.pdf

    标题“试析用Java实现链表数据结构.pdf”所揭示的知识点涵盖了Java编程语言在内存管理和链表数据结构实现方面的深入探讨。描述中提到的“#资源达人分享计划#”可能意味着这篇文章是作为知识分享的一部分,而标签...

    java版链表实现定时器功能

    实现链表定时器的关键步骤如下: 1. **定义节点类**:创建一个`TimerNode`类,包含两个属性:`task`(代表任务对象)和`time`(代表任务的执行时间)。 2. **初始化链表**:创建一个空链表,头节点为null。 3. **...

    JAVA链表实现类(数据结构学习)

    JAVA链表实现类(数据结构学习).chm

Global site tag (gtag.js) - Google Analytics