Java实现单链表LinkedList

创建单链表,实现对链表的一些基本操作

  • 先定义结点
package com.fz.linked;

/**
 * 模拟链表,定义链表结点,使用泛型。
 * 使结点的data的数据类型可以根据用
 * 户传入的数据类型匹配
 * @author fang
 * 
 */
public class Node <E>{
	
	/**
	 * 链表的下一个结点
	 */
	Node<E> next=null;
	
	/**
	 * 存储的数据
	 */
	E data;
	
	/**
	 * 创建一个结点
	 * @param data
	 */
	public Node(E data) {
		this.data=data;
	}

}

  • 实现链表
package com.fz.linked;

/**
 * 实现单链表,使用泛型,实现存储多种数据类型
 * 
 * @author fang
 *
 */
public class MyLinkedList<E> {

	/**
	 * 链表长度
	 */
	private int length;

	/**
	 * 定义头结点
	 */
	Node<E> head = null;

	/**
	 * 插入结点
	 * 
	 * @param data
	 */
	public void addNode(E data) {
		// 创建一个结点
		Node<E> newNode = new Node<E>(data);

		// 如果头结点==null,在头结点插入
		if (head == null) {
			head = newNode;
			length++;
			return;
		}
		// 否则,在头结点后面插入新的结点
		Node<E> tmp = head;
		// 找到插入结点的位置
		while (tmp.next != null) {
			tmp = tmp.next;
		}
		tmp.next = newNode;
		length++;
	}

	/**
	 * 取得第index个元素
	 * 
	 * @param index
	 * @return
	 */
	public E getIndex(int index) {
		if (index < 0) {
			return null;
		}
		Node<E> p1 = head;
		for (int i = 0; i < index && p1 != null; i++) {
			p1 = p1.next;
		}
		if (p1 == null) {
			return null;
		}

		return p1.data;
	}

	/**
	 * 取得第一个元素
	 * 
	 * @return
	 */
	public E getFirst() {
		if (head != null) {
			return head.data;
		}
		return null;
	}

	/**
	 * 取得最后一个元素
	 * 
	 * @return
	 */
	public E getLast() {
		if (head == null) {
			return null;
		}
		Node<E> p1 = head;
		for (int i = 0; i < length - 1 && p1 != null; i++) {
			p1 = p1.next;
		}
		return p1.data;
	}

	/**
	 * 删除第i个结点
	 * 
	 * @param index
	 * @return
	 */
	public boolean deleteIndex(int index) {
		// 判断index是否合法
		if (index < 0 && index >= length) {
			return false;
		}
		Node<E> preNode = head;
		Node<E> curNode = preNode.next;
		for (int i = 0; i < index - 1 && curNode != null; i++) {
			preNode = preNode.next;
			curNode = curNode.next;
		}
		// 更改preNode结点的指向当前结点指向的下一个结点
		preNode.next = curNode.next;
		--length;
		return true;
	}

	/**
	 * 取得长度
	 * 
	 * @return
	 */
	public int length() {
		return this.length;
	}

	/**
	 * 输出
	 */
	public void printList() {
		Node<E> tmp = head;
		while (tmp != null) {
			System.out.println(tmp.data);
			tmp = tmp.next;
		}
	}

}
  • 测试链表
package com.fz.linked;

public class Test {
	
	public static void main(String[] args) {
		MyLinkedList<Integer> linkedList=new MyLinkedList<>();
		linkedList.addNode(4);
		linkedList.addNode(3); 
		linkedList.addNode(5); 
		linkedList.addNode(7);
		
		//输出
		linkedList.printList();
		//取得第一个元素
		System.out.println("第一个元素:"+linkedList.getFirst());
		//取得最后一个元素
		System.out.println("最后一个元素:"+linkedList.getLast());
		//取得第i个元素
		System.out.println(linkedList.getIndex(3));
		//删除成功返回true
		System.out.println(linkedList.deleteIndex(3));
		//取得长度
		System.out.println("链表长度:"+linkedList.length());

	}

}
运行结果:
4
3
5
7
第一个元素:4
最后一个元素:7
7
true
链表长度:3
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值