结点(Node):
结点是链表中的基本组成单位,每一个结点包含两个部分:数据域和指针域(在Java中就是引用)。其中数据域存放当前结点的数据,而指针域存放一个指针(引用),指向下一个结点。这样一个一个的结点通过指针(引用)链接起来就构成了链表。
Node类实现:
//结点
public class Node {
//数据
public int date;
//下一个结点
public Node next;
//date传值的构造方法
public Node(int date) {
this.date=date;
}
//缺省的构造方法
public Node() {
}
}
链表:
链表中一个最重要的结点就是第一个结点,俗称头结点,或者叫头指针。头结点的特殊性在于没有前面的结点来指向它,在将结点链接成链表时是一定需要一个头结点来指向后面的结点的,不然后面的结点就像找不到妈妈的小蝌蚪,哈哈。当然,尾结点也重要,链表总要有一个尾结点来标志着链表的结束。后面构建链表时我用的就是尾插法建表。同时,一个链表是具有长度的,也就是链表中结点的个数。
链表基本成员:
头结点:first
尾结点:last
链表大小:size
链表及其方法实现:
import java.util.Scanner;
//链表的实现
public class MyLinkedList {
// 创建静态内部类Node
private static class Node {
// 数据
public int date;
// 下一个结点
public Node next;
// date传值的构造方法
public Node(int date) {
this.date = date;
}
// 缺省的构造方法
public Node() {
}
}
// 头结点和尾结点
private Node first;
private Node last ;
private int size;
//初始化链表
public MyLinkedList() {
first = null;
last = null;
size = 0;
}
// 判断链表是否为空
public boolean empty() {
if (first == null)
return true;
else
return false;
}
// 给链表创建新结点并链接(尾插法建表)
public void add(int date) {
// 创建新结点
Node node = new Node(date);
// 如果头结点为空,头结点指向新结点,且新结点成为当前结点
if (first == null) {
first = node;
last = node;
size++;
} else {
// 创建新结点后,先建立与新结点的链接,再将当前结点更新
last.next = node;
last = node;
size++;
}
last.next = null;
}
// 在链表中第k个结点位置插入一个新结点
public void insert(int k, int value) {
if (k > size || k < 1) {
System.out.println("插入的新结点位置有误!");
return;
}
int index = 1;
Node cur = first;
Node prev = cur;
Node newNode = new Node(value);
// 在头结点位置插入结点
if (k == 1) {
first = newNode;
first.next = cur;
size++;
return;
}
while (index < k) {
prev = cur;
cur = cur.next;
index++;
}
prev.next = newNode;
newNode.next = cur;
size++;
return;
}
// 将链表中结点的date值为value的全部删除
public void deleteValue(int value) {
if (first == null) {
System.out.println("The linkedlist is null!");
return;
}
// first.next == null 说明first = last
while (first.date == value && first != null) {
if (first.next == null) {
first = null;
size--;
return;
}
first = first.next;
size--;
}
Node prev = new Node();
Node cur = first;
prev = first;
while (cur != null && prev != null) {
//
while (cur != last && cur.date == value) {
prev.next = cur.next;
cur = cur.next;
size--;
}
if (cur == last) {
last = prev;
return;
}
prev = cur;
cur = cur.next;
}
}
// 将链表中第k个结点删除
public void deleteNode(int k) {
if (first == null) {
System.out.println("The linkedlist is null!");
return;
}
// 如果要删除的结点序号大于链表长度直接return
if (k > size || k < 1) {
return;
}
// 如果链表只有一个结点直接清空
if (k == 1 && first.next == null) {
first = null;
size--;
return;
}
// 其他清空删除第一个结点将头结点向后移一位即可
if (k == 1 && first.next != null) {
first = first.next;
size--;
return;
} else {
int index = 1;
Node cur = new Node();
Node prev = new Node();
cur = first;
prev = cur;
while (index < k) {
prev = cur;
cur = cur.next;
index++;
}
prev.next = cur.next;
size--;
}
}
// 修改将第k个结点的数据
public void update(int k, int newvalue) {
if (k < 1 || k > size) {
System.out.println("修改的结点有误!");
return;
}
if (k == 1) {
first.date = newvalue;
return;
}
Node cur = new Node();
int index = 1;
cur = first;
while (index < k) {
cur = cur.next;
index++;
}
cur.date = newvalue;
}
// 在链表中查找目标元素并返回目标元素的下标
public int search(int key) {
int index = 1;
if (first.date == key) {
return index;
}
Node cur = new Node();
cur = first;
while (cur.next != null) {
cur = cur.next;
index++;
if (cur.date == key) {
return index;
}
}
// 返回-1表示查找失败
return -1;
}
// 清空链表
public void clearList() {
first = null;
last = null;
}
// 返回链表长度
public int length() {
return size;
}
// 在控制台输出链表
public void display() {
//新建一个cur结点遍历链表
Node cur = new Node();
if (first == null) {
System.out.print("The linkedlist is null!");
return;
} else {
cur = first;
}
while (cur != null) {
System.out.print(cur.date + " ");
cur = cur.next;
}
}
public static void main(String[] args) {
MyLinkedList list = new MyLinkedList();
Scanner read = new Scanner(System.in);
int key = read.nextInt();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println("List:");
list.display();
System.out.println();
System.out.println("The length of the linkedlist:" + list.length());
System.out.println(key+"在链表中第"+list.search(key)+"个结点上");
read.close();
}
}