鍊錶問題05 反轉部分單向鍊錶

2021-09-10 14:57:54 字數 1274 閱讀 6998

【題目】

給定乙個單向鍊錶的頭節點head,以及兩個整數from和to,在單向鍊錶上把第from個節點到第to個節點這一部分進行反轉。

例如:1 -> 2 -> 3 -> 4 -> 5 -> null,from = 2,to = 4

調整結果為:1 -> 4 - > 3 -> 2 -> 5 -> null

再如:1 -> 2 -> 3 -> null,from = 1,to = 3

調整結果為:3 -> 2 -> 1 -> null

【要求】

如果鍊錶長度為n,時間複雜度要求為o(n),額外空間複雜度為o(1)。

如果不滿足1 <= from <= to <= n,則不用調整。

【解答】

先判斷是否滿足1 <= from <= to <= n,如果不滿足,則直接返回原來的頭節點。

找到第from-1個節點fpre和第to+1個節點tpos。fpre就是要反轉部分的前乙個節點,tpos是反轉部分的後乙個節點。把反轉的部分先反轉,然後正確地連線fpre和tpos。例如:1 -> 2 -> 3 -> 4 -> null,假設fpre為節點1,tpos為節點4,要反轉部分為2 -> 3。先反轉成3 -> 2,然後fpre連向節點3,節點2連向tpos,就變成1 -> 3 -> 2 -> 4 -> null。

如果fpre為null,說明反轉部分是包含頭節點的,則返回新的頭節點,也就是沒反轉之前反轉部分的最後乙個節點,也是反轉之後反轉部分的第乙個節點;如果fpre不為null,則返回舊的頭節點。

【**實現】

struct  node

};static node *reversepartlist(node *head, int from, int to)

if (from > to || from < 1 || to > len)

node1 = fpre == nullptr ? head : fpre->next;

node *node2 = node1->next;

node1->next = tpos;

node *next = nullptr;

while (node2 != tpos)

if (fpre != nullptr)

return node1;

}

【**】

《程式設計師**面試指南(it名企演算法與資料結構題目最優解)》左程雲

反轉部分單向鍊錶

給定乙個單向鍊錶的頭節點head,以及兩個整數from和to,在單項鍊表上把第from個節點到to個節點的這一部分進行反轉。例如 1 2 3 4 5 null from 2,to 4 調整結果為1 4 3 2 5 null 再如1 2 3 null from 1,to 3 調整結果為3 2 1 nu...

反轉部分單向鍊錶

說明 本文是左程雲老師所著的 程式設計師面試 指南 第二章中 反轉部分單向鍊錶 這一題目的c 復現。本文只包含問題描述 c 的實現以及簡單的思路,不包含解析說明,具體的問題解析請參考原書。感謝左程雲老師的支援。題目 給定乙個單向鍊錶的頭節點 head,以及兩個整數 from 和 to,在單向鍊錶上把...

反轉部分單向鍊錶

給定乙個單向鍊錶的頭節點head,以及兩個整數from和to,在單向鍊錶上把第from個節點到第to個節點這一部分進行反轉。例如 1 2 3 4 5 6 null,from 3,to 5 調整結果為 1 2 5 4 3 6 null 1 2 3 null,from 1,to 3 調整結果為 3 2 ...