最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
unity加载与链表
2015年01月28日 14:03
0 点赞
0 评论
更新于 2025-11-21 15:40
今天给大家分享一下Unity加载与链表相关内容。由于上一讲已经介绍过加载相关知识,本次主要聚焦于链表问题,并且会分享相应的源代码。如果大家在阅读过程中有任何疑问,可以在社区里提问,我会及时解答。
Unity用C#编写的链表类
该链表类用于保存坐标点,以下是具体的代码实现及详细解释。
using UnityEngine;
using System;
using System.Collections;
namespace CS
{
/// <summary>
/// 结点类
/// </summary>
public class ListNode
{
public Vector3 data; // 存储坐标点数据
public ListNode() { } // 无参构造函数
public ListNode next; // 指向下一个结点的引用
}
/// <summary>
/// 链表类
/// </summary>
public class LinkList
{
private ListNode first; // 链表的第一个结点
public LinkList()
{
first = null; // 初始化链表为空
}
/// <summary>
/// 判断链表是否为空
/// </summary>
/// <returns>如果链表为空返回true,否则返回false</returns>
public bool IsEmpty()
{
return first == null;
}
/// <summary>
/// 在第k个元素之后插入x
/// </summary>
/// <param name="k">插入位置</param>
/// <param name="x">要插入的数据</param>
/// <returns>返回当前链表实例</returns>
public LinkList Insert(int k, Vector3 x)
{
if (k < 0)
{
return null; // 插入位置不合法
}
ListNode pNode = first; // pNode将最终指向第k个结点
for (int index = 1; index < k && pNode != null; index++)
{
pNode = pNode.next;
}
if (k > 0 && pNode == null)
{
return null; // 不存在第k个元素
}
ListNode xNode = new ListNode();
xNode.data = x;
if (k > 0)
{
// 在pNode之后插入
xNode.next = pNode.next;
pNode.next = xNode;
}
else
{
// 作为第一个元素插入
xNode.next = first;
first = xNode;
}
return this;
}
/// <summary>
/// 获取链表的长度
/// </summary>
/// <returns>返回链表的长度</returns>
public int Length()
{
ListNode current = first;
int length = 0;
while (current != null)
{
length++;
current = current.next;
}
return length;
}
/// <summary>
/// 返回第k个元素至x中
/// </summary>
/// <param name="k">元素位置</param>
/// <param name="x">用于存储第k个元素的引用</param>
/// <returns>如果不存在第k个元素则返回false,否则返回true</returns>
public bool Find(int k, ref Vector3 x)
{
if (k < 1)
{
return false; // 位置不合法
}
ListNode current = first;
int index = 1;
while (index < k && current != null)
{
current = current.next;
index++;
}
if (current != null)
{
x = current.data;
return true;
}
return false;
}
/// <summary>
/// 返回x所在的位置
/// </summary>
/// <param name="x">要查找的数据</param>
/// <returns>如果x不在表中则返回0,否则返回其位置</returns>
public int Search(Vector3 x)
{
ListNode current = first;
int index = 1;
while (current != null && current.data != x)
{
current = current.next;
index++;
}
if (current != null)
{
return index;
}
return 0;
}
/// <summary>
/// 删除第k个元素,并用x返回其值
/// </summary>
/// <param name="k">要删除的元素位置</param>
/// <param name="x">用于存储被删除元素的引用</param>
/// <returns>返回当前链表实例</returns>
public LinkList Delete(int k, ref Vector3 x)
{
if (k < 1 || first == null)
{
return null; // 位置不合法或链表为空
}
ListNode pNode = first; // pNode将最终指向第k个结点
if (k == 1)
{
first = first.next; // 删除第一个元素
}
else
{
// 用qNode指向第k - 1个元素
ListNode qNode = first;
for (int index = 1; index < k - 1 && qNode != null; index++)
{
qNode = qNode.next;
}
if (qNode == null || qNode.next == null)
{
return null; // 不存在第k个元素
}
pNode = qNode.next; // pNode指向第k个元素
qNode.next = pNode.next; // 从链表中删除第k个元素
x = pNode.data;
}
return this;
}
/// <summary>
/// 清空链表
/// </summary>
public void Clear()
{
first = null;
}
}
}
以上代码实现了一个简单的单向链表,包含了链表的基本操作,如插入、查找、删除等。在实际应用中,你可以根据具体需求对链表进行扩展和优化。