算法与数据结构笔记11——单链表(Singly Linked List)

本文详细介绍了单链表这一数据结构的概念及其在Java中的具体实现,包括节点的追加、删除和插入等基本操作,并通过代码示例展示了如何创建和使用单链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

了解数据结构的小伙伴,应该有听说过单链表。那么是单链表呢?单链表的使用是怎么样的呢?下面就分享一下我理解的单链表。

单链表概念

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

单链表示例图

在这里插入图片描述

单链表操作Demo

1.创建一个单链表类Node

package com.wyb.list;

// 一个节点
public class Node {
	// 节点内容
	int data;
	
	// 下一个节点
	Node next;
	
	public Node(int data) {
		this.data = data;
	}
	
	// 为节点追加节点
	public Node append(Node node) {
		// 当前节点
		Node currentNode = this;
		// 循环向后找
		while(true) {
			// 取出下一个界面
			Node nextNode = currentNode.next;
			// 如果下一个节点为null,当前界面已经是最后一个节点
			if(nextNode == null) {
				break;
			}
			// 赋值给当前节点 
			currentNode = nextNode;
		}
		// 把需要追加的节点追加为找到的当前节点的下一个节点
		currentNode.next = node;
		return this;
	}
	
	// 删除下一个节点
	public void removeNext() {
		// 取出下下一个节点
		Node newNext = next.next;
		// 把下下一个节点设置为当前节点的下一个节点
		this.next = newNext;
	}
	
	// 插入一个节点
	public void after(Node node) {
		// 取出一个节点,作为下下一个节点
		Node nextNext = next;
		// 把新节点作为当前节点的下一个节点
		this.next = node;
		// 把下下一个节点设置为新节点的下一个节点
		node.next = nextNext;	
	}
	
	// 显示所有节点信息
	public void show() {
		Node currentNode = this;
		while(true) {
			System.out.print(currentNode.data+" ");
			// 取出下一个节点
			currentNode = currentNode.next;
			// 如果是最后一个节点
			if(currentNode ==null) {
				break;
			}
		}
	}
	
	// 获取下一个节点的方法
	public Node next() {
		return this.next;
	}
	
	// 获取节点中的数据
	public int getDate() {
		return this.data;
	}
	
	// 当前节点是否是最后一个节点
	public boolean isLast() {
		return next == null;
	}
}

2.创建一个测试类TestNode

package com.wyb.list;

public class TestNode {

	public static void main(String[] args) {
		Node n1 = new Node(1);
		Node n2 = new Node(2);
		Node n3 = new Node(3);
		// 追加节点
		n1.append(n2).append(n3).append(new Node(4));
		// 取出下一个节点
//		System.out.println(n1.next().next().next().getDate());
		// 判断节点是否为最后一个节点x
//		System.out.println(n1.isLast());
//		System.out.println(n1.next().next().next().isLast());
		// 显示所有节点信息
		n1.show();
		// 删除一个节点
//		n1.next().removeNext();
		// 显示所有节点信息
//		n1.show();
		System.out.println();
		// 插入一个新节点
		Node node = new Node(5);
		n1.next().after(node);
		n1.show();
	}
}
在已有的单链表结构基础上,实现链表的分段功能通常意味着我们需要将一个大链表分割成几个较小的、相互独立的部分,每个部分形成一个新的链表。这个过程可能会基于特定条件,比如节点值的范围、特定的索引位置或者是用户给定的长度等。下面是一个简单的Python示例,展示如何通过遍历链表并维护新的链表头节点来实现这一功能: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def segment_list(head, segment_size): # 如果链表为空或segment_size为0,直接返回None if not head or segment_size == 0: return None dummy = ListNode(0) # 创建虚拟头节点 dummy.next = head current = dummy segment_head = ListNode() # 存储当前段的头部 for _ in range(segment_size): # 分割前几个元素 if current.next is None: break current = current.next else: segment_head.next = dummy.next # 将第一个段连接到新链表 dummy.next = None # 更新原链表的起点 while current: # 拷贝当前段到新的链表,然后移动指针 new_segment_head = ListNode(current.val) new_segment_head.next = segment_head.next segment_head.next = new_segment_head for _ in range(segment_size - 1): # 继续处理下一个段,直到无法再分 if current.next is None: break current = current.next else: # 如果还有剩余节点,更新当前段的结尾,并准备下一段 segment_head.next = current.next current.next = None return segment_head.next # 返回新的链表的头部 # 使用示例 head = ListNode(1, ListNode(2, ListNode(3, ListNode(4)))) result = segment_list(head, 2) # 将链表分为每两个节点一组 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值