学习双向链表带哨兵demo

news/2024/7/7 21:09:04

定义

在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续。

双向链表,每个元素知道其上一个元素和下一个元素。

以下为示例代码:

package com.tfq.arithmetic.linkedlist;

import java.util.Iterator;
import java.util.function.Consumer;

/**
 * @author: fqtang
 * @date: 2024/05/21/9:29
 * @description: 双向链表(带哨兵)
 */
public class DoubleLinkedListSentinel implements Iterable<Integer> {

	static class Node {
		Node prev;//上一个节点指针
		int value;//值
		Node next;//下一个节点指针

		public Node(Node prev, int value, Node next) {
			this.prev = prev;
			this.next = next;
			this.value = value;
		}

	}

	private Node head;//头哨兵
	private Node tail;//尾哨兵

	public DoubleLinkedListSentinel() {
		this.head = new Node(null, 666, null);
		this.tail = new Node(null, 999, null);
		head.next = tail;
		tail.prev = head;
	}

	/**
	 * 返回链表第一种方式
	 *
	 * @return
	 */
	public void loop(Consumer<Integer> consumer) {
		Node p = head.next;
		while(p != null) {
			consumer.accept(p.value);
			p = p.next;
		}
	}

	/**
	 * 返回链表第二种方式
	 *
	 * @return
	 */
	public void loop2(Consumer<Integer> consumer) {
		for(Node p = head.next; p != null; p = p.next) {
			consumer.accept(p.value);
		}
	}

	public void addFirst(int value) {
		insert(0, value);
	}

	public void addLast(int value) {
		Node last = tail.prev;
		Node insertNode = new Node(last, value, tail);
		last.next = insertNode;
		tail.prev = insertNode;
	}

	private Node findLast() {
		return tail.prev;
	}

	public void removeLast() {
		Node remove = tail.prev;
		if(remove == head) {
			throw new IllegalArgumentException(String.format("双向链表为空,不能删除此链表的头部!"));
		}
		Node prev = remove.prev;

		prev.next = tail;
		tail.prev = prev;
	}

	/**
	 * 根据索引查找链表的节点
	 *
	 * @param index
	 * @return
	 */
	private Node findNode(int index) {
		int i = -1;
		for(Node p = head; p != tail; p = p.next, i++) {
			if(i == index) {
				return p;
			}
		}

		return null;//没找到
	}

	public int getValue(int index) {
		Node node = findNode(index - 1);
		if(node == head || node == tail) {
			throw new IllegalArgumentException(String.format("index [%d] 不合法%n", index));
		}
		return findNode(index - 1).value;
	}

	/**
	 * 向索引位置插值
	 *
	 * @param index 索引
	 * @param value 待插入值
	 */
	public void insert(int index, int value) {
		//找到上一个节点和下一个节点
		Node prev = findNode(index - 1);
		if(prev == null) {
			throw new IllegalArgumentException(String.format("index [%d] 不合法%n", index));
		}
		Node next = prev.next;
		//创建一个要插入的新节点
		Node insertedNode = new Node(prev, value, next);
		prev.next = insertedNode;
		next.prev = insertedNode;
	}

	/**
	 * 删除第一个节点
	 */
	public void removeFirst() {
		remove(0);
	}

	/**
	 * 根据索引删除指定元素
	 *
	 * @param index 待删除索引
	 */
	public void remove(int index) {
		Node prev = findNode(index - 1);
		if(prev == null) {
			throw new IllegalArgumentException(String.format("index [%d] 不合法%n", index));
		}
		Node removed = prev.next;
		if(removed == tail) {
			throw new IllegalArgumentException(String.format("index [%d] 不合法,已删除尾部 %n", index));
		}
		Node next = removed.next;

		prev.next = next;
		next.prev = prev;
	}

	/**
	 * 返回链表第三种方式
	 *
	 * @return
	 */
	@Override
	public Iterator<Integer> iterator() {

		return new Iterator<Integer>() {
			Node p = head.next;

			@Override
			public boolean hasNext() {
				return p != tail;
			}

			@Override
			public Integer next() {
				int v = p.value;
				p = p.next;
				return v;
			}
		};
	}
}


http://lihuaxi.xjx100.cn/news/2173533.html

相关文章

力扣HOT100 - 169. 多数元素

解题思路&#xff1a; 有点类似于Boyer-Moore 投票算法&#xff0c;但更加形象。 class Solution {public int majorityElement(int[] nums) {int winner nums[0];int cnt 1;for (int i 1; i < nums.length; i) {if (winner nums[i]){cnt;} else if (cn…

TS(TypeScript)中Array数组无法调出使用includes方法,显示红色警告

解决方法 打开tsconfig.json文件&#xff0c;添加"lib": ["es7", "dom"]即可。 如下图所示。

HTML静态网页成品作业(HTML+CSS)——动漫熊出没介绍网页(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有3个页面。 二、作品演示 三、代…

记一次重定向问题(浏览器安全)解决

近期做单点登陆功能&#xff0c;本身应该是一个很简单的功能&#xff0c;却发生了意向不到的问题…让我们看下&#xff1a; 首先第三方给出的地址需要通过JWT框架获取token拼接后跳转&#xff0c;我这边为了方便首选肯定是考虑用response.sendRedirect(url)&#xff0c;但是做好…

你还不知道宠物空气净化器的五大好处?难怪家里总有异味和猫毛!

养猫是一件非常令人愉快的事情&#xff0c;猫咪的陪伴能带给我们无尽的欢乐。然而&#xff0c;随着时间的推移&#xff0c;许多养猫的朋友会发现一个问题&#xff0c;那就是家中的猫毛和异味问题。其实&#xff0c;解决这些问题的关键就在于选择一款高效的宠物空气净化器。今天…

再次学习History.scrollRestoration

再次学习History.scrollRestoration 之前在react.dev的源代码中了解到了这个HIstory的属性&#xff0c;当时写了一篇笔记来记录我对它的理解&#xff0c;现在看来还是一知半解。所以今天打算重新学习一下这个属性&#xff0c;主要从属性以及所属对象的介绍、使用方法&#xff0…

ORACLE 数据库中v$datafile 与 v#datafile_header中的checkpoint_change#(scn号)的区别

v$datafile 查看该视图中的信息 SELECT FILE#,STATUS,NAME&#xff0c;CHECKPOINT_CHANGE# FROM V$DATAFILE;这里的scn号是来自于控制文件 v$datafile_header SELECT FILE#,STATUS,NAME&#xff0c;CHECKPOINT_CHANGE# FROM V$DATAFILE_HEADER; 这里的scn号是来自于数据文件…

selenium学习笔记

什么是selenium 比较官方的解释 Selenium是一个自动化测试工具&#xff0c;用于在Web应用程序中模拟用户操作。它提供了一组API&#xff0c;可以通过编程方式控制浏览器&#xff0c;并模拟用户的交互行为&#xff0c;例如点击、输入文本和导航等。Selenium支持多种编程语言&a…