listnode*
reverselist
(listnode* head)
if(head-
>next==
nullptr
) listnode* p = head;
listnode* q = p-
>next;
listnode* r =
nullptr
; p-
>next =
nullptr
;while
(q)return p;
}
關鍵點:
1.雖是三個指標,但是逐個元素進行操作
2.使用p和q兩個指標配合工作,使得兩個節點間的指向反向,同時用r記錄剩下的鍊錶
3.q是操作完的最後乙個元素,因此要返回它
參考:給你單鏈表的頭指標 head 和兩個整數 left 和 right ,其中 left <= right 。請你反轉從位置 left 到位置 right 的鍊錶節點,返回 反轉後的鍊錶 。
示例 1:
輸入:head = [1,2,3,4,5], left = 2, right = 4
輸出:[1,4,3,2,5]
示例 2:
輸入:head = [5], left = 1, right = 1
輸出:[5]
鍊錶中節點數目為 n
1 <= n <= 500
-500 <= node.val <= 500
1 <= left <= right <= n
思路:利用全部反轉的邏輯,作一次封裝;
關鍵點:
1.儲存或記錄要反轉部分的前繼和後繼node;
2.判斷特殊值,如,要反轉的部分是從煉表頭開始的這種情況;
/**
* definition for singly-linked list.
* struct listnode
* listnode(int x) : val(x), next(nullptr) {}
* listnode(int x, listnode *next) : val(x), next(next) {}
* };
*/class
solution
if(left > list_length || right > list_length)
return
nullptr
;int index =1;
int length = right - left +1;
listnode *temp_tail =
nullptr
;//要反轉的長度就是鍊錶的長度,那直接全部返轉
if(length == list_length)
return
reverse
(head, length,
&temp_tail)
;//要反轉的長度就是鍊錶的長度為1,那可以不作任何操作
if(left == right)
return head;
p =nullptr
;//儲存要反轉部分的前繼
q = head;
//儲存要反轉部分的第乙個節點
while
(index < left)
//儲存要反轉部分的第乙個節點
listnode *temp_head =
reverse
(q, length,
&temp_tail)
;//要反轉的部分有可能是從鍊錶頭部開始的做個判斷即可
if(p)
else
}/*head:反轉部分的第乙個節點
length:反轉部分的長度
tail:指向要反轉部分的最後乙個結點的下乙個元素(以備後序的拼接 )
返回值:返回反轉成功後的煉表頭
*/listnode *
reverse
(listnode *head,
int length, listnode *
*tail)
}*tail = q;
return p;}}
;
鍊錶部分反轉
反轉鍊錶的一部分,從第m個到第n個節點反轉,m n都小於鍊錶長度。public void reverselist list l,int m,int n 定義乙個新的臨時頭指標 node tmp node 0 tmp.next l 移動頭指標到第 m 1 個節點 node pre tmp for in...
反轉部分單向鍊錶
給定乙個單向鍊錶的頭節點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,在單向鍊錶上把...