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;
}
}
}

以上代码实现了一个简单的单向链表,包含了链表的基本操作,如插入、查找、删除等。在实际应用中,你可以根据具体需求对链表进行扩展和优化。