这道C的解题思路是怎样的?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1090个文字,预计阅读时间需要5分钟。
原文:本文明白地延续了《关于某道C》的内容。
本文继承并阐述了《某道C相关》的核心观点。
本文继续 《关于某道C#上机题的OO - 策略模式》中的题目,但这是使用的是双向循环链表。当第一次看到这题我首先想到的是循环链表,但题目要求面向对象的方法,汗~首先是双向链表的节点类
1///<summary>
2///双向链表节点
3///</summary>
4///<typeparamname="T"></typeparam>
5publicclassDoubleLinkNode<T>
6{
7publicDoubleLinkNode(){}
8publicDoubleLinkNode(Titem)
9{
10Value=item;
11}
12///<summary>
13///节点值
14///</summary>
15publicTValue{get;set;}
16///<summary>
17///下一个节点
18///</summary>
19publicDoubleLinkNode<T>Next{get;set;}
20///<summary>
21///前一个节点
22///</summary>
23publicDoubleLinkNode<T>Previous{get;set;}
24publicoverridestringToString()
25{
26returnValue.ToString();
27}
28}这里使用的是泛型类,他的优势就不讨论了,下面是循环链表类
///<summary>
///双向循环链表
///</summary>
///<typeparamname="T"></typeparam>
publicclassCircleList<T>:IEnumerable<T>
{
privateintcurrentIndex;
privateDoubleLinkNode<T>current;
///<summary>
///头节点
///</summary>
publicDoubleLinkNode<T>First{get;privateset;}
///<summary>
///尾节点
///</summary>
publicDoubleLinkNode<T>Last{get;privateset;}
///<summary>
///节点数
///</summary>
publicintCount{get;privateset;}
///<summary>
///索引
///</summary>
///<paramname="index"></param>
///<returns></returns>
publicDoubleLinkNode<T>this[intindex]
{
get
{
if(Count-index<index)
{
currentIndex=Count-1;
current=Last;
while(currentIndex>0)
{
if(currentIndex==index)break;
currentIndex--;
current=current.Previous;
}
}
else
{
Reset();
while(currentIndex<Count-1)
{
if(currentIndex==index)break;
currentIndex++;
current=current.Next;
}
}
returncurrent;
}
}
///<summary>
///在尾部添加节点
///</summary>
///<paramname="node"></param>
publicvoidAddLast(DoubleLinkNode<T>node)
{
if(Last==null)Last=node;
if(First==null)First=node;
Last.Next=node;
node.Previous=Last;
Last=node;
node.Next=First;
First.Previous=node;
Count++;
Last.Next=First;
}
///<summary>
///在尾部添加节点
///</summary>
///<paramname="item"></param>
publicvoidAddLast(Titem)
{
DoubleLinkNode<T>node=newDoubleLinkNode<T>(item);
AddLast(node);
}
///<summary>
///移除节点
///</summary>
///<paramname="node"></param>
publicvoidRemove(DoubleLinkNode<T>node)
{
node.Previous.Next=node.Next;
node.Next.Previous=node.Previous;
Count--;
}
///<summary>
///移除节点
///</summary>
///<paramname="item"></param>
publicvoidRemove(Titem)
{
DoubleLinkNode<T>node=Find(o=>o.Value.Equals(item));
if(node==null)return;
Remove(node);
Count--;
}
///<summary>
///查找节点
///</summary>
///<paramname="match"></param>
///<returns></returns>
publicDoubleLinkNode<T>Find(Predicate<DoubleLinkNode<T>>match)
{
Reset();
while(currentIndex<Count)
{
if(match(current))
{
returncurrent;
}
currentIndex++;
current=current.Next;
}
returnnull;
}
publicIEnumerator<T>GetEnumerator()
{
Reset();
while(currentIndex<Count)
{
yieldreturncurrent.Value;
current=current.Next;
currentIndex++;
}
}
IEnumeratorIEnumerable.GetEnumerator()
{
returnthis.GetEnumerator();
}
publicoverridestringToString()
{
strings=string.Empty;
Reset();
while(currentIndex<Count)
{
s+=string.Format("Node:{0}NextNode:{1}PreviousNode:{2}\r\n",current,current.Next,current.Previous);
currentIndex++;
current=current.Next;
}
returns;
}
///<summary>
///清除
///</summary>
publicvoidClear()
{
Count=0;
First=null;
Last=null;
}
privatevoidReset()
{
currentIndex=0;
current=First;
}
}由于没用使用DoubleLinkNode<T>[] 来存储数据,所以索引的处理显得非常的麻烦(如果用了数组就存在链表的容量问题),希望高手们能给出好的方法。
下面就是具体实现了
classProgram
{
staticvoidMain(string[]args)
{
//初始化数据
CircleList<Person>list=newCircleList<Person>();
for(inti=0;i<17;i++)
{
list.AddLast(newPerson(i+1));
}
//当前报数人
DoubleLinkNode<Person>current=list.First;
//报数序号
intk=0;
//循环报数
while(list.Count>1)
{
k++;
Console.WriteLine(string.Format("{0}:{1}",current.Value.Id,k));
if(k%3==0)
list.Remove(current);
current=current.Next;
}
Console.WriteLine(string.Format("LastPerson:{0}",current.Value.Id));
Console.Read();
}
}
///<summary>
///玩家
///</summary>
publicclassPerson
{
publicPerson(intid)
{
this.Id=id;
}
publicintId{get;set;}
}
下面是结果
本文共计1090个文字,预计阅读时间需要5分钟。
原文:本文明白地延续了《关于某道C》的内容。
本文继承并阐述了《某道C相关》的核心观点。
本文继续 《关于某道C#上机题的OO - 策略模式》中的题目,但这是使用的是双向循环链表。当第一次看到这题我首先想到的是循环链表,但题目要求面向对象的方法,汗~首先是双向链表的节点类
1///<summary>
2///双向链表节点
3///</summary>
4///<typeparamname="T"></typeparam>
5publicclassDoubleLinkNode<T>
6{
7publicDoubleLinkNode(){}
8publicDoubleLinkNode(Titem)
9{
10Value=item;
11}
12///<summary>
13///节点值
14///</summary>
15publicTValue{get;set;}
16///<summary>
17///下一个节点
18///</summary>
19publicDoubleLinkNode<T>Next{get;set;}
20///<summary>
21///前一个节点
22///</summary>
23publicDoubleLinkNode<T>Previous{get;set;}
24publicoverridestringToString()
25{
26returnValue.ToString();
27}
28}这里使用的是泛型类,他的优势就不讨论了,下面是循环链表类
///<summary>
///双向循环链表
///</summary>
///<typeparamname="T"></typeparam>
publicclassCircleList<T>:IEnumerable<T>
{
privateintcurrentIndex;
privateDoubleLinkNode<T>current;
///<summary>
///头节点
///</summary>
publicDoubleLinkNode<T>First{get;privateset;}
///<summary>
///尾节点
///</summary>
publicDoubleLinkNode<T>Last{get;privateset;}
///<summary>
///节点数
///</summary>
publicintCount{get;privateset;}
///<summary>
///索引
///</summary>
///<paramname="index"></param>
///<returns></returns>
publicDoubleLinkNode<T>this[intindex]
{
get
{
if(Count-index<index)
{
currentIndex=Count-1;
current=Last;
while(currentIndex>0)
{
if(currentIndex==index)break;
currentIndex--;
current=current.Previous;
}
}
else
{
Reset();
while(currentIndex<Count-1)
{
if(currentIndex==index)break;
currentIndex++;
current=current.Next;
}
}
returncurrent;
}
}
///<summary>
///在尾部添加节点
///</summary>
///<paramname="node"></param>
publicvoidAddLast(DoubleLinkNode<T>node)
{
if(Last==null)Last=node;
if(First==null)First=node;
Last.Next=node;
node.Previous=Last;
Last=node;
node.Next=First;
First.Previous=node;
Count++;
Last.Next=First;
}
///<summary>
///在尾部添加节点
///</summary>
///<paramname="item"></param>
publicvoidAddLast(Titem)
{
DoubleLinkNode<T>node=newDoubleLinkNode<T>(item);
AddLast(node);
}
///<summary>
///移除节点
///</summary>
///<paramname="node"></param>
publicvoidRemove(DoubleLinkNode<T>node)
{
node.Previous.Next=node.Next;
node.Next.Previous=node.Previous;
Count--;
}
///<summary>
///移除节点
///</summary>
///<paramname="item"></param>
publicvoidRemove(Titem)
{
DoubleLinkNode<T>node=Find(o=>o.Value.Equals(item));
if(node==null)return;
Remove(node);
Count--;
}
///<summary>
///查找节点
///</summary>
///<paramname="match"></param>
///<returns></returns>
publicDoubleLinkNode<T>Find(Predicate<DoubleLinkNode<T>>match)
{
Reset();
while(currentIndex<Count)
{
if(match(current))
{
returncurrent;
}
currentIndex++;
current=current.Next;
}
returnnull;
}
publicIEnumerator<T>GetEnumerator()
{
Reset();
while(currentIndex<Count)
{
yieldreturncurrent.Value;
current=current.Next;
currentIndex++;
}
}
IEnumeratorIEnumerable.GetEnumerator()
{
returnthis.GetEnumerator();
}
publicoverridestringToString()
{
strings=string.Empty;
Reset();
while(currentIndex<Count)
{
s+=string.Format("Node:{0}NextNode:{1}PreviousNode:{2}\r\n",current,current.Next,current.Previous);
currentIndex++;
current=current.Next;
}
returns;
}
///<summary>
///清除
///</summary>
publicvoidClear()
{
Count=0;
First=null;
Last=null;
}
privatevoidReset()
{
currentIndex=0;
current=First;
}
}由于没用使用DoubleLinkNode<T>[] 来存储数据,所以索引的处理显得非常的麻烦(如果用了数组就存在链表的容量问题),希望高手们能给出好的方法。
下面就是具体实现了
classProgram
{
staticvoidMain(string[]args)
{
//初始化数据
CircleList<Person>list=newCircleList<Person>();
for(inti=0;i<17;i++)
{
list.AddLast(newPerson(i+1));
}
//当前报数人
DoubleLinkNode<Person>current=list.First;
//报数序号
intk=0;
//循环报数
while(list.Count>1)
{
k++;
Console.WriteLine(string.Format("{0}:{1}",current.Value.Id,k));
if(k%3==0)
list.Remove(current);
current=current.Next;
}
Console.WriteLine(string.Format("LastPerson:{0}",current.Value.Id));
Console.Read();
}
}
///<summary>
///玩家
///</summary>
publicclassPerson
{
publicPerson(intid)
{
this.Id=id;
}
publicintId{get;set;}
}
下面是结果

