Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java: LinkedList reversal in chunks

Tags:

java

algorithm

If you are provided the head of a linked list, and are asked to reverse every k sequence of nodes, how might this be done in Java? e.g., a->b->c->d->e->f->g->h with k = 3 would be c->b->a->f->e->d->h->g->f

Any general help or even pseudocode would be greatly appreciated! Thanks!

like image 412
OckhamsRazor Avatar asked Apr 22 '12 21:04

OckhamsRazor


1 Answers

If k is expected to be reasonably small, I would just go for the simplest thing: ignore the fact that it's a linked list at all, and treat each subsequence as just an array-type thing of things to be reversed.

So, if your linked list's node class is a Node<T>, create a Node<?>[] of size k. For each segment, load k Nodes into the array list, then just reverse their elements with a simple for loop. In pseudocode:

// reverse the elements within the k nodes
for i from 0 to k/2:
    nodeI = segment[i]
    nodeE = segment[segment.length-i-1]
    tmp = nodeI.elem
    nodeI.elem = nodeE.elem
    nodeE.elem = tmp

Pros: very simple, O(N) performance, takes advantage of an easily recognizable reversing algorithm.

Cons: requires a k-sized array (just once, since you can reuse it per segment)

Also note that this means that each Node doesn't move in the list, only the objects the Node holds. This means that each Node will end up holding a different item than it held before. This could be fine or not, depending on your needs.

like image 160
yshavit Avatar answered Oct 12 '22 07:10

yshavit