1. 程式人生 > >單鏈表反轉,要求空間複雜度O(1)

單鏈表反轉,要求空間複雜度O(1)

這是一道筆試題:

        給你一個指向單鏈表表頭的指標,要你把整個連結串列反轉,並且空間複雜度為O(1),最後返回指向新的連結串列頭的指標。連結串列節點結構和函式頭已給出:

struct LinkNode
{
  int data;
  LinkNode *next;
};
LinkNode* ReverseLink(LinkNode *head)
{
  
}

分析:

        基礎題,空間複雜度O(1)意味著不能複製一個臨時連結串列出來,必須在原連結串列上直接操作。However,就算題目不要求空間複雜度O(1),我相信也不會有人捨近求遠去建立一個臨時連結串列。

程式碼:

LinkNode* ReverseLink(LinkNode *head)
{
  LinkNode *nowHead = head, *sourceLink = head->next, *tempNode = NULL;
  while (sourceLink != NULL)
  {
    tempNode = sourceLink;                  // 把源連結串列首節點取出
    sourceLink = sourceLink->next;          // 源連結串列首節點後移
    tempNode->next = nowHead;               // 取出的節點接在目標連結串列的首部
    nowHead = tempNode;                     // 目標連結串列首部更改為新的節點
  }
  head->next = NULL;                        // 別忘了把原先的連結串列頭指向NULL
  return nowHead;
}