创建单链表,实现对链表的一些基本操作
- 先定义结点
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