Связанный список кодирования длин серий на месте (Java)

Мой LinkedList связан исключительно (каждый узел имеет количество + следующую ссылку).

Мне нужно создать метод runlengthencode, который принимает LinkedList и возвращает закодированную версию списка без создания каких-либо новых узлов, т.е. на месте. Это на Java.

Проблема, с которой я сталкиваюсь, заключается в отслеживании узлов, представляющих начало прогона, которые будут отображаться в новом списке по мере того, как я иду по нему. Где я могу добавить узлы rle в внешний цикл while ниже?

В настоящее время у меня есть ссылка под названием CurrRun и бегун, который идет от CurrRun, в то время как значения CurrRun и CurrRun.next одинаковы.

Осторожно: этот код был лишен уродливого синтаксиса Java везде, где это возможно

//instantiated nodes here

currRun = myListHead.next
Node runner = currRun

while (currRun.next != null){

   int count = 1;

   while (runner.value == runner.next.value){
     count++
     runner = runner.next
   //no more runs in current run
   //update currRun count
   currRun.count = count

   //move currRun to next run node
   currRun = runner.next
   }

}
// return the myHead-> currNode1 -> currNode2 -> .... -> null
return myHead

Любые указатели будут высоко оценены.

СТОН: В Американской большой школе нас должны этому учить, но мы предоставлены сами себе


person Vince    schedule 30.07.2012    source источник
comment
Меня смущает ограничение на месте. Кодирование длин серий должно генерировать список пар (количество, значение). Этот список, вероятно, будет отличаться по длине от исходного списка. Как это может быть на месте?   -  person Keith Randall    schedule 30.07.2012
comment
На месте, как без дополнительной памяти, то есть без создания новых узлов и без использования дополнительных структур данных.   -  person Vince    schedule 30.07.2012
comment
Решение, которое я придумал после некоторых размышлений, консультаций и т. д., имеет узел, который остается с первым узлом каждой серии длин и бегуном. Бегун всегда на один узел опережает неподвижный узел. В то время как применяется условие длины цикла: увеличивается количество стационарных узлов с приращением. Установите стационарное.next для следующего бегуна. Как только условие больше не применяется, стационарный узел перемещается в следующую серию с бегуном на один узел. Это продолжается до тех пор, пока runner == null.   -  person Vince    schedule 06.08.2012


Ответы (1)


Я бы не стал записывать результат обратно в currRun. Вместо этого я бы сохранил указатель на n-й узел в списке и записал n-й запуск обратно в этот узел. Таким образом, ваш недавно закодированный rle список будет непрерывным, и вам не придется беспокоиться о том, какие узлы представляют начало выполнения, а какие нет.

person Keith Randall    schedule 30.07.2012