双链表:交换两个相邻节点而没有临时变量

时间:2015-06-12 08:17:28

标签: doubly-linked-list

这段代码是C ++ - 就像它使用类/对象一样。实际上它只是C,因为我在玩游戏,在不使用STL的情况下实现双向链表。

语言无关紧要。困扰我的是我使用了一个临时变量。

任何人都可以改进此代码,以便不需要临时变量吗?这是一个简单的冒泡排序,但我关心的是交换双链表中的两个相邻节点。

class LinkedListItem *linkedListItem;
bool swapped;

do
{
  swapped = false;

  for (linkedListItem = uniqueWords.GetHead();
       linkedListItem != NULL;
       linkedListItem = linkedListItem->GetNext())
  {
     if (linkedListItem->GetNext() != NULL)
     {
         if (linkedListItem->GetWordCount() < linkedListItem->GetNext()->GetWordCount())
         {
            // Swap items to bubble smaller value up.

            // Rats!! I can't seem to do it by juggling pointers without a temp variable :-(
            // ToDo: figure out how!
            class LinkedListItem *itemAfterNext;
            if (linkedListItem->GetNext() == NULL)
               itemAfterNext = NULL;
            else
               itemAfterNext = linkedListItem->GetNext()->GetNext();

            if (uniqueWords.GetHead() == linkedListItem)
               uniqueWords.SetHead(linkedListItem->GetNext());

            if (uniqueWords.GetTail() == linkedListItem->GetNext())
               uniqueWords.SetTail(linkedListItem);

////--------- start swap -----------  
            if (linkedListItem->GetPrev() != NULL)
                linkedListItem->GetPrev()->SetNext(linkedListItem->GetNext());

            if (linkedListItem->GetNext()->GetNext() != NULL)
                linkedListItem->GetNext()->GetNext()->SetPrev(linkedListItem);

                 linkedListItem->GetNext()->SetPrev(linkedListItem->GetPrev());
            linkedListItem->GetNext()->SetNext(linkedListItem);

            linkedListItem->SetPrev(linkedListItem->GetNext());
            linkedListItem->SetNext(itemAfterNext);
////--------- end swap -----------

            swapped = true;
         }
     }
   }
} while (swapped == true);

0 个答案:

没有答案