static HeadTail ReverseR(LinkListNode head) { if (head == null) { return(null); } else { HeadTail headTail = ReverseR(head.next); if (headTail == null) { LinkListNode tail = head.clone(); tail.next = null; //LinkListNode returnHead = tail; return(new HeadTail(tail, tail)); } else { LinkListNode node = head.clone(); node.next = null; headTail.Tail.next = node; return(new HeadTail(headTail.Head, node)); } } }
public LinkListNode clone() { LinkListNode next2 = null; if (next != null) { next2 = next.clone(); } LinkListNode head2 = new LinkListNode(data, next2, null); return(head2); }
{//Palindrom: Implement a function to check if a linked list is a palindrom. static void Main(string[] args) { //3210123 int[] a1 = new int[] { 3, 2, 1, 0, 1, 2, 3 }; LinkListNode n3210123 = BuildListWithArray(a1); LinkListNode n3210123_clone1 = n3210123.clone(); LinkListNode n3210123_clone2 = n3210123.clone(); bool r1 = isPanlindrom(n3210123); bool r1half = isPanlindromReverseHalf(n3210123_clone1); bool r1r = isPanlindromR(n3210123_clone2); Console.WriteLine("Results: {0}, {1}, {2} for Node {3}", r1, r1half, r1r, n3210123.printForward()); //32100123 int[] a2 = new int[] { 3, 2, 1, 0, 0, 1, 2, 3 }; LinkListNode n32100123 = BuildListWithArray(a2); LinkListNode n32100123_clone1 = n32100123.clone(); LinkListNode n32100123_clone2 = n32100123.clone(); bool r2 = isPanlindrom(n32100123); bool r2half = isPanlindromReverseHalf(n32100123_clone1); bool r2r = isPanlindromR(n32100123_clone2); Console.WriteLine("Results: {0}, {1}, {2} for Node {3}", r2, r2half, r2r, n32100123.printForward()); //4321908 int[] a3 = new int[] { 4, 3, 2, 1, 9, 0, 8 }; LinkListNode n4321908 = BuildListWithArray(a3); LinkListNode n4321908_clone1 = n4321908.clone(); LinkListNode n4321908_clone2 = n4321908.clone(); bool r3 = isPanlindrom(n4321908); bool r3half = isPanlindromReverseHalf(n4321908_clone1); bool r3r = isPanlindromR(n4321908_clone2); Console.WriteLine("Results: {0}, {1}, {2} for Node {3}", r3, r3half, r3r, n4321908.printForward()); }
//Method 1: reverse the whole list, check with the original one. O(n) time, O(n) space. static bool isPanlindrom(LinkListNode head) { LinkListNode reverseNode = head.clone(); //reverseNode = Reverse(reverseNode); reverseNode = ReverseRec(head); while (head != null) { if (head.data != reverseNode.data) return false; reverseNode = reverseNode.next; head = head.next; } return true; }
//Method 1: reverse the whole list, check with the original one. O(n) time, O(n) space. static bool isPanlindrom(LinkListNode head) { LinkListNode reverseNode = head.clone(); //reverseNode = Reverse(reverseNode); reverseNode = ReverseRec(head); while (head != null) { if (head.data != reverseNode.data) { return(false); } reverseNode = reverseNode.next; head = head.next; } return(true); }
static HeadTail ReverseR(LinkListNode head) { if (head == null) return null; else { HeadTail headTail = ReverseR(head.next); if (headTail == null) { LinkListNode tail = head.clone(); tail.next = null; //LinkListNode returnHead = tail; return new HeadTail(tail, tail); } else { LinkListNode node = head.clone(); node.next = null; headTail.Tail.next = node; return new HeadTail(headTail.Head, node); } } }