您的位置:首页 > 其它

关于链表的三个常用算法

2013-07-01 11:29 429 查看
//找到环的第一个入口点
static public SinglyLinkedListNode<T> FindLoopPort(SinglyLinkedList<T> list)
{
SinglyLinkedListNode<T> pslow = list.head;
SinglyLinkedListNode<T> pfast = list.head;
//为什么有环的单向链表这样做一定会相交?
while (pfast != null && pfast.next != null)
{
pslow = pslow.next;        // 每次前进一步
pfast = pfast.next.next;  // 每次前进二步
if (pslow == pfast)          // 两个指针相遇,说明存在环
break;
}
if (pfast == null || pfast.next == null)    // 不存在环
return null;
pslow = list.head;
while (pslow != pfast)
{
pslow = pslow.next;        // 每次前进一步
pfast = pfast.next;        // 每次前进一步
}
return pslow;       // 返回环的入口点
}

//两个无环单向链表是否相交, 若相交则求出第一个相交的节点
static public SinglyLinkedListNode<T> Intersection(SinglyLinkedList<T> list1, SinglyLinkedList<T> list2)
{
int len1 = list1.Count;
int len2 = list2.Count;
int distance=Math.Abs(len1-len2);
SinglyLinkedListNode<T> head1=list1.head;
SinglyLinkedListNode<T> head2=list2.head;
if (len1 < len2)
{
for (int i = 0; i < distance; i++)
head2 = head2.next;
}
else if (len2 < len1)
{
for (int i = 0; i < distance; i++)
head1 = head1.next;
}
//指针对齐之后开始确定相交节点
while (head1.next != null && head2.next != null && head1 != head2)
{
head1 = head1.next;
head2 = head2.next;
}
if (head1 != null && head2 != null)
return head1;
else
return null;
}

//单向链表的反转
static public void Reverse(SinglyLinkedList<T> list)
{
SinglyLinkedListNode<T> p, q;
SinglyLinkedListNode<T> temp;
if (list.Count >= 2)
{
p = list.head;
q = p.next;
}
else
return;
while (q != null)
{
temp = q.next;
q.next = p;
p = q;
q = temp;
}

list.head.next = null;
list.head = p;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: