欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

单向链表存储结构及反转

程序员文章站 2022-07-10 19:12:33
单向链表存储结构及反转单向链表存储结构import java.util.Stack;/** * * @ClassName SingleLinkedListDemo * @Description * @Author 明月照海心 * @Date 2020年7月20日 下午8:21:13 */public class SingleLinkedListDemo {public static void main(String[] args) {SingleLinkedList s...

单向链表存储结构及反转


单向链表存储结构
单向链表存储结构及反转

import java.util.Stack;

/**
 * 
 * @ClassName SingleLinkedListDemo
 * @Description
 * @Author 明月照海心
 * @Date 2020年7月20日 下午8:21:13
 */
public class SingleLinkedListDemo {

	public static void main(String[] args) {
		SingleLinkedList singleLinkedList = new SingleLinkedList();
		singleLinkedList.add(20);
		singleLinkedList.add("hello");
		singleLinkedList.add(40);
		singleLinkedList.add("mingyue");
		singleLinkedList.add(60);

		System.out.println("----------遍历所有元素----------");
		singleLinkedList.showList();

		System.out.println("元素的个数:" + singleLinkedList.getSize());

		System.out.println("----------删除一个元素----------");
		Object remove = singleLinkedList.remove(60);
		System.out.println("移除的元素是:" + remove);
		singleLinkedList.showList();

		System.out.println("元素的个数:" + singleLinkedList.getSize());

		singleLinkedList.reverse();
		System.out.println("----------反转后的元素----------");
		singleLinkedList.showList();

		System.out.println("----------倒序打印元素----------");
		singleLinkedList.reversePint();

	}
}

class SingleLinkedList {

	// 定义头结点
	private Node first = new Node(null, null);

	private int size;

	public int getSize() {
		return size;
	}

	/**
	 * 添加元素
	 * 
	 * @param e
	 */
	public void add(Object e) {

		// 头结点不能动,需要辅助结点进行操作
		Node head = first;
		// 新建结点将元素存进去
		Node node = new Node(e, null);
		while (true) {
			// 如果当前节点的next为空,则将next指向当前节点
			if (head.next == null) {
				head.next = node;
				size++;
				break;
			}

			head = head.next;
		}
	}

	/**
	 * 删除元素
	 * 
	 * @param e
	 * @return
	 */
	public Object remove(Object e) {

		// 头结点不能动,需要辅助结点进行操作
		Node head = first;
		// 判断是否有元素
		if (head.next == null) {
			System.out.println("链表中没有元素!");
			return null;
		}

		// 遍历所有节点
		while (true) {

			if (head.next == null) {
				System.out.println("在链表中没有找到当前元素!");
				break;
			}

			// 查看当前节点元素是否和形参元素相同
			if (e == head.next.item || e.equals(head.next.item)) {
				Node removeNode = head.next;
				head.next = removeNode.next;
				size--;
				return removeNode.item;
			}
			head = head.next;
		}
		return null;
	}

	/**
	 * 显示所有元素
	 */
	public void showList() {

		// 头结点不能动,需要辅助结点进行操作
		Node head = first;

		// 判断是否有元素
		if (head.next == null) {
			System.out.println("链表中没有元素!");
		}
		while (true) {

			// 如果当前节点的next为空,则结束循环
			if (head.next == null) {
				break;
			}
			head = head.next;
			System.out.println(head.item);
		}
	}

	/**
	 * 节点内部类
	 * 
	 * @ClassName Node
	 * @Description
	 * @Author 明月照海心
	 * @Date 2020年7月20日 下午8:25:50
	 */
	private class Node {
		Object item;
		Node next;

		Node(Object element, Node next) {
			this.item = element;
			this.next = next;

		}
	}
}

单向链表的反转
单向链表存储结构及反转

/**
	 * 反转链表
	 */
	public void reverse() {
		// 获取当前结点
		Node cur = first.next;
		// 定义一个反转后的头结点
		Node reverseFirstNode = new Node(null, null);
		// 当前元素个数小于2不需要反转
		if (size < 2) {
			return;
		}
		while (cur != null) {

			// 此处有点绕
			// 首先取出当前节点的下个节点(如果不取出,下行代码会覆盖其值)
			Node next = cur.next;
			// 当前元素的下一个节点指向所定义头结点的下一个节点(比如插队的时候需要和当前插入位置所在的人说一声)
			cur.next = reverseFirstNode.next;
			// 定义的头结点指向当前节点
			reverseFirstNode.next = cur;
			// 节点继续向下移动
			cur = next;

		}
		// 当前节点替换所定义的头结点
		first.next = reverseFirstNode.next;

	}

单向链表的反转输出
单向链表存储结构及反转

/**
	 * 使用栈实现链表的倒序输出
	 */
	public void reversePint() {

		// 获取当前结点
		Node cur = first.next;
		if (cur == null) {
			System.out.println("当前链表为空!");
			return;
		}
		// 创建栈对象
		Stack<Object> stack = new Stack<>();

		while (cur != null) {
			// 当前元素进栈 (此处用add方法一样,add返回boolean,push返回当前元素)
			stack.push(cur.item);
			// 元素后移
			cur = cur.next;
		}

		// 遍历输出
		while (stack.size() > 0) {
			System.out.println(stack.pop());
		}
	}

本文地址:https://blog.csdn.net/qq_40889383/article/details/107476678