`
love19820823
  • 浏览: 933960 次
文章分类
社区版块
存档分类
最新评论

C# 逆转 单链表 想起我老早以前一直有的错误思想

 
阅读更多

以下代码是我从“http://blog.csdn.net/netfuns/archive/2008/04/09/2267435.aspx”copy过来的,先感谢原作者,省了写代码的时间。

记得老早以前我一直很模糊这个算法,尤其是我标黑的两行代码,最近在重新学习数据结构和算法方面的东西,就想起来了这段程序了,写出来做个自我批评吧,我之前总是以为 q = p;p = p.next;之后q也指向了p.next。因为我之前觉得对象引用一变就都变了,这就是我始终觉得这段代码不对的原因,其实呢 q = p;语句传递的是指向对象存储的指针,呵呵....希望现在不会有像我之前一样迷糊的人了....

/// <summary>
/// 模拟单链表
/// </summary>
class LinkNode
{
public object data;
public LinkNode next;

public LinkNode(object adata)
{
this.data = adata;
}
}

class LinkUtil
{
/// <summary>
/// 反转单链表,用两个辅助节点
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
public static LinkNode Inverse(LinkNode node)
{


// r,q,p 一步一步,像走路一样
// p总是指向下一个节点
//q 用来跟上p
//r 用来存储断开的节点
LinkNode r = null;
LinkNode q = null;
LinkNode p = node;

while (p != null)
{
r = q;
q = p;
p = p.next;

q.next = r;
}


return q;

}
/// <summary>
/// 打印单链表
/// </summary>
/// <param name="list"></param>
public static void PrintList(LinkNode list)
{
LinkNode p=list;
while (p != null)
{
Console.WriteLine(p.data);
p = p.next;
}
}

/// <summary>
/// 测试
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
LinkNode n1 = new LinkNode("1");
LinkNode n2 = new LinkNode("2");
LinkNode n3 = new LinkNode("3");
LinkNode n4 = new LinkNode("4");

n1.next = n2;
n2.next = n3;
n3.next = n4;
Console.WriteLine("before reverse:");
PrintList(n1);
Console.WriteLine("after reverse:");
LinkNode head= Inverse(n1);

PrintList(head);

Console.Read();


}
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics