Java实现单链表

结点(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();
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值