链表的基本操

 

实现链表的增加、删除、查找和反转

 

class Link{
	public int iData;
	public Link next;
	
	public Link(int data){
		iData=data;
	}
	
	public void display(){
		System.out.print(iData+" ");
	}
}

 class LinkList{
	private Link first;
	
	public LinkList(){
		first=null;
	}
	//插入头节点
	public void insertFirst(int data){
		Link newlink=new Link(data);
		newlink.next=first;
		first=newlink;
	}
	//删除头结点
	public Link deleteFirst(){
		Link temp=first;
		first=first.next;
		return temp;
	}
	//查找
	public Link find(int key){
		Link current=first;
		while(current.iData!=key){
			if(current.next==null){
				return null;
			}else{
				current=current.next;
			}
			
		}
		return current;
	}
	//删除任意节点
	public Link delete(int key){
		Link current=first;
		Link previous=first;
		while(current.iData!=key){
			if(current.next==null){
				return null;
			}else{
				previous=current;
				current=current.next;	
			}
		}
		if(current==first){
			first=first.next;
		}else{
			previous.next=current.next;
		}
		return current;
	}
	//反转链表-循环
	public void reverse(){
		Link current=first;
		Link nextlink=null;
		Link prelink=null;
		while(current!=null){
			//存储为反转前的next节点
			nextlink=current.next;
			//反转当前节点的指针为当前节点的前一个节点
			current.next=prelink;
			//所有指针向后移动
			prelink=current;
			current=nextlink;
			
		}
		}
	
	//反转链表-递归
	public Link recReverse(Link current){
		current=first;
		Link nextlink=null;
		if(current==null||current.next==null){
			return current;
		}	
		nextlink=current.next;
		Link rec=recReverse(nextlink);
		nextlink.next=current;
		return rec;
	}
}

 

判断链表中是否存在回路,快慢指针法

//判断是否存在回路-快慢指针
	public boolean isLoop(){
		Link low=first;
		Link fast=first;
		while((low!=null)&&(fast!=null)){
			low=low.next;
			fast=fast.next.next;
			if(low.iData==fast.iData){
				return true;
			}
			
			return false;
	}



 

WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行双向通信,极大地提高了实时性,被广泛应用于即时通讯、在线游戏、股票交易等领域。本篇将详细讲解如何使用C#来实现WebSocket,以及Fleck库在其中的作用。 WebSocket协议基于HTTP的握手过程,但一旦连接建立,它就不再依赖HTTP,而是通过TCP直接通信。在C#中,我们可以利用.NET Framework或.NET Core提供的System.Net.WebSockets命名空间来创建WebSocket服务器和客户端。然而,对于更高级的功能和更好的灵活性,开发者通常会选择第三方库,如Fleck。 Fleck是C#中一个轻量级且高效的WebSocket服务器实现。它提供了丰富的事件驱动API,使得开发者可以轻松地处理WebSocket连接的建立、消息传递和断开等作。下面我们将探讨Fleck的使用步骤: 1. **安装Fleck**:你需要在你的项目中添加Fleck库。如果你使用的是NuGet包管理器,可以通过搜索"Fleck"并安装来获取。 2. **初始化服务器**:在C#代码中,首先创建一个Fleck服务器实例,指定监听的IP地址和端口号。例如: ```csharp var server = new Fleck.WebSocketServer("ws://localhost:8080"); ``` 3. **配置服务器**:你可以设置各种配置选项,如最大接收/发送缓冲区大小、心跳间隔等。然后注册事件处理器,如OnOpen、OnClose、OnMessage等,以处理客户端连接、断开和消息接收。 4. **连接事件**:`OnOpen`事件在客户端连接时触发,你可以在这里对新连接进行初始化作,如存储连接信息、验证用户等。 5. **消息处理**:`OnMessage`
### C++ STL 双向链表的实现与用法 #### 1. 基本概念 双向链表是一种数据结构,其中每个节点不仅包含自身的数据,还包含两个指针:一个指向下一个节点(`next`),另一个指向前一个节点(`prev`)。这种设计使得可以在任意位置高效地插入或删除节点[^2]。 在C++标准模板库(STL)中,`std::list` 是一种基于双向链表的数据容器。它提供了许多高效的插入和删除作方法,适用于频繁增删场景下的应用需求[^3]。 --- #### 2. `std::list` 的基本实现原理 `std::list` 使用了一个带有头结点(哨兵节点)的双向循环链表来管理元素。以下是其核心部分: - **默认构造函数** 默认情况下会创建一个空列表,并初始化一个特殊的“哨兵”节点,该节点的前驱和后继都指向自身[^1]。 - **拷贝构造函数** 拷贝构造函数通过临时对象的方式完成复制工作。具体过程如下: - 调用私有成员函数 `empty_initialize()` 初始化当前实例为空状态; - 创建一个新的临时列表 `tmp` 并利用范围构造方式填充目标区间 `[lt.begin(), lt.end())` 中的所有元素; - 将新构建好的临时列表中的资源转移到当前实例上,最后销毁临时变量以释放多余内存。 ```cpp List(const List<T>& lt) { empty_initialize(); List<T> tmp(lt.begin(), lt.end()); swap(tmp); } ``` - **交换函数 (`swap`)** 提供了一种快速互换两份独立列表内部状态的方法,仅需调整几个关键字段而无需真正搬移任何实际存储单元内的内容。 ```cpp void swap(List<T>& lt) { std::swap(_head, lt._head); std::swap(_size, lt._size); } ``` --- #### 3. 主要功能及其复杂度分析 | 功能 | 描述 | 时间复杂度 | |------|------|------------| | 插入 | 在指定位置之前/之后新增加一项 | O(1) | | 删除 | 移除特定项 | O(1) | | 访问 | 查找某个固定索引处的对象 | O(n) | 由于底层采用了链接机制而非连续区块布局形式,因此随机访问效率较低;然而对于局部更新类任务来说却具备显著优势。 --- #### 4. 示例代码展示如何使用 `std::list` 下面给出一段简单的例子演示怎样定义以及控这个类型的集合体: ```cpp #include <iostream> #include <list> int main() { // 定义并初始化一个整数型别的双端队列 std::list<int> myList = {10, 20, 30}; // 添加新的项目到前面或者后面 myList.push_front(5); myList.emplace_back(35); // 迭代遍历整个序列打印出来 for(auto it=myList.cbegin();it!=myList.cend();++it){ std::cout << *it << ' '; } return 0; } ``` 上述程序先建立好初始含有三个数值 `{10, 20, 30}` 的清单实体 `myList`, 接着分别调用了前置追加(`push_front`) 和后置附加(`emplace_back`) 方法扩充容量至五个单位长度。最终借助增强版for-loop语法逐一输出各成分值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值