Skip to content

Instantly share code, notes, and snippets.

@unilecs
Created October 22, 2017 20:35
Show Gist options
  • Save unilecs/2669c05c89a8ec5424202568a8ad359d to your computer and use it in GitHub Desktop.
Save unilecs/2669c05c89a8ec5424202568a8ad359d to your computer and use it in GitHub Desktop.
Является ли односвязный список палиндромом
using System;
using System.Collections.Generic;
public class Program
{
public class LinkedList
{
public int Value { get; set; }
public LinkedList Next { get; set; }
}
public static bool LinkedListIsPalindrome(LinkedList head)
{
var stack = new Stack<LinkedList>();
LinkedList fastPointer = head;
LinkedList slowPointer = head;
// когда быстрый бегунок (двигается со скоростью 2x) достигает конца списка
// мы узнаем где середина
while (fastPointer != null && fastPointer.Next != null)
{
// записываем узлы в стек
stack.Push(slowPointer);
slowPointer = slowPointer.Next;
fastPointer = fastPointer.Next.Next;
}
// нечетное кол-во элементов в списке, пропускаем средний элемент
if (fastPointer != null)
{
slowPointer = slowPointer.Next;
}
while (slowPointer != null)
{
// если значения различаются, это не палиндром
if (slowPointer.Value != stack.Pop().Value)
{
return false;
}
slowPointer = slowPointer.Next;
}
return true;
}
public static void Main()
{
Console.WriteLine("UniLecs");
var root = new LinkedList { Value = 1 };
root.Next = new LinkedList { Value = 2 };
root.Next.Next = new LinkedList { Value = 3 };
root.Next.Next.Next = new LinkedList { Value = 2 };
root.Next.Next.Next.Next = new LinkedList { Value = 1 };
root.Next.Next.Next.Next.Next = null;
var linkedListIsPalindrom = LinkedListIsPalindrome(root);
Console.WriteLine("Linked list is palindrom: {0}", linkedListIsPalindrom);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment