Удвоение всех вхождений элементов, расположенных на четных (0-четное) позициях - C#
Формулировка задачи:
Разработать два метода для класса List (однонаправленный список и двунаправленный список).
Удвоение всех вхождений элементов, расположенных на четных (0-четное) позициях (DublicateOnEvenPos()).
Исходник однонаправленного списка (уже начал писать этот метод, но не получается):
Исходник двунаправленного списка
Main
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lists
{
class List<T>: IEnumerable<T>, IEnumerator<T>
{
class ListItem<T1>
{
public T Data { get; set; }
public ListItem<T> Next { get; set; }
}
private ListItem<T> firstItem;
private ListItem<T> currentItem;
public T Current
{
get
{
if (currentItem == null)
throw new NullReferenceException("Current item can't be null");
return currentItem.Data;
}
set
{
if (currentItem == null)
throw new NullReferenceException("Current item can't be null");
currentItem.Data = value;
}
}
public void AddFirst(T item)
{
ListItem<T> newItem = new ListItem<T>();
newItem.Data = item;
newItem.Next = firstItem;
firstItem = newItem;
}
public IEnumerator<T> GetEnumerator()
{
return this;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this;
}
public void Dispose()
{
}
object System.Collections.IEnumerator.Current
{
get
{
if (currentItem == null)
throw new NullReferenceException("Current item can't be null");
return currentItem.Data;
}
}
public bool MoveNext()
{
if (currentItem == null)
{
if (HasValues)
{
currentItem = firstItem;
return true;
}
return false;
}
if (currentItem.Next != null)
{
currentItem = currentItem.Next;
return true;
}
Reset();
return false;
}
public void Reset()
{
currentItem = null;
}
public bool HasValues
{
get { return firstItem != null; }
}
public void DublicateOnEvenPos()
{
ListItem<T> newItem = new ListItem<T>();
var Count = 0; // счетчик для элементов
newItem = firstItem;
while (MoveNext())
{
if (Count % 2 == 0 || Count == 0)
{
newItem = currentItem;
newItem.Next = currentItem.Next;
currentItem.Next = newItem;
}
Count++;
}
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ListsDemo
{
public class DoubleList<T> : IEnumerable<T>, IEnumerator<T>
{
class ListItem<T1>
{
public ListItem<T1> Prev { get; set; }
public T1 Data { get; set; }
public ListItem<T1> Next { get; set; }
}
private ListItem<T> firstItem;
private ListItem<T> currentItem;
private ListItem<T> lastItem;
public T Current
{
get
{
if (currentItem == null)
throw new NullReferenceException("Current item can't be null");
return currentItem.Data;
}
set
{
if (currentItem == null)
throw new NullReferenceException("Current item can't be null");
currentItem.Data = value;
}
}
public void AddFirst(T item)
{
ListItem<T> newItem = new ListItem<T>();
newItem.Data = item;
newItem.Next = firstItem;
firstItem = newItem;
if(firstItem.Next == null)
{
lastItem = firstItem;
}
else
{
firstItem.Next.Prev = firstItem;
}
}
public IEnumerator<T> GetEnumerator()
{
return this;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this;
}
public void Dispose()
{
}
object System.Collections.IEnumerator.Current
{
get
{
if (currentItem == null)
throw new NullReferenceException("Current item can't be null");
return currentItem.Data;
}
}
public bool MoveNext()
{
if (currentItem == null)
{
if (HasValues)
{
currentItem = firstItem;
return true;
}
return false;
}
if (currentItem.Next != null)
{
currentItem = currentItem.Next;
return true;
}
Reset();
return false;
}
public void Reset()
{
currentItem = null;
}
public bool HasValues
{
get { return firstItem != null; }
}
}
}using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lists
{
class Program
{
static void Main(string[] args)
{
List<int> lst = new List<int>();
lst.AddFirst(5);
lst.AddFirst(4);
lst.AddFirst(3);
lst.AddFirst(2);
lst.AddFirst(1);
lst.DublicateOnEvenPos();
PrintList(lst);
Console.ReadLine();
}
private static void PrintList(List<int> lst)
{
Console.WriteLine("------------");
foreach (var item in lst)
{
Console.WriteLine(item);
}
}
}
}Решение задачи: «Удвоение всех вхождений элементов, расположенных на четных (0-четное) позициях»
textual
Листинг программы
public List<T> DublicateOnEvenPos()
{
var tmpCount = 0;
//Создаём список, с которым будем работать
List<T> tmpList = new List<T>();
//Переносимся в начало списка
currentItem = firstItem;
while (currentItem != null)
{
if (tmpCount % 2 == 0)
{
tmpList.AddFirst(currentItem.Data);
tmpList.AddFirst(currentItem.Data);
// После этого копирования оставшиеся элементы будут стоять в обратном порядке
}
else
{
tmpList.AddFirst(currentItem.Data);
}
tmpCount++;
MoveNext();
}
// Создаем конечный список, в который скопируем элементы из предыдущего,
//чтобы восстановить порядок
List<T> list = new List<T>();
foreach (T tmp in tmpList)
{
list.AddFirst(tmp);
}
return list;
}