public void ReverseInPlace(ref SNode node, int k) { var headToResult = new SNode(); var prev = headToResult; var visitor = node; while (visitor != null) { var head = visitor; int i = 0; while (i < k - 1 && visitor != null) { visitor = visitor.Next; i++; } var tail = visitor; if (visitor != null) { visitor = visitor.Next; tail.Next = null; } head = new ReverseSingleLinkedList().Reverse(head); prev.Next = head; prev = FindTail(head); } node = headToResult.Next; }
public SNode Zip(SNode list) { var fast = list; var slow = list; while (slow != null && fast != null && fast.Next != null) { slow = slow.Next; fast = fast.Next.Next; } var head1 = list; var head2 = slow.Next; slow.Next = null; // split lists head2 = new ReverseSingleLinkedList().Reverse(head2); // Merge head1 and head2 var it1 = head1; var it2 = head2; bool useLeft = true; SNode result = new SNode(); SNode tail = new SNode(); while (it1 != null && it2 != null) { var nodeToAdd = useLeft ? new SNode(it1.Value) : new SNode(it2.Value); if (result.Next == null) { result.Next = nodeToAdd; tail.Next = result.Next; } else { AddToTail(ref tail, nodeToAdd); } if (useLeft) { it1 = it1.Next; } else { it2 = it2.Next; } useLeft = !useLeft; } AddRemainingItems(ref tail, it1); AddRemainingItems(ref tail, it2); return(result.Next); }
public void Reverse(ref SNode node, int k) { var splitLists = new List <SNode>(); var nodeCount = CountNodes(node); int finalListCount = (int)Math.Ceiling((decimal)nodeCount / k); int i = 0; SNode nextList = node; while (i < finalListCount) { SNode head = nextList; SNode it = head; int m = 0; while (m < k - 1 && it != null) { it = it.Next; m++; } if (it != null) { nextList = it.Next; it.Next = null; } splitLists.Add(head); i++; } var reversedLists = new List <SNode>(); foreach (var list in splitLists) { var rlist = new ReverseSingleLinkedList().Reverse(list); reversedLists.Add(rlist); } node = Merge(reversedLists); }