給定乙個單鏈表 l:l0→l1→…→ln-1→ln ,
將其重新排列後變為: l0→ln→l1→ln-1→l2→ln-2→…
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例 1:
給定鍊錶 1->2->3->4, 重新排列為 1->4->2->3.
示例 2:
給定鍊錶 1->2->3->4->5, 重新排列為 1->5->2->4->3.
第一種思路:雙重迴圈,每次尋找末尾節點都重新遍歷一次
1、先獲取鍊錶長度,根據長度算出中點;
2、遍歷到中點的所有節點,找出對應的末端節點,進行連線即可;
思路比較簡單,用時較長;
第二種思路:
1、將節點存入陣列中;
2、根據陣列位置,重新連線鍊錶;
思路比較簡答,用時較短;
思路1:不借助別的空間,每次尋找末尾節點都重新遍歷一次
/**
* definition for singly-linked list.
* struct listnode ;
*/void
reorderlist
(struct listnode* head)
/*若節點長度小於等於2,則直接返回*/
if(inodelen <=2)
return
;
node = head;
/*遍歷節點到中點位置停止*/
for(i=1;
(inodelen-1)
/2-i>=
0;i++
) node->next = rnode;
rnode->next = next;
node = next;
}/*清空最後乙個節點的指向*/
if(inodelen-2*
(i-1)==
1)else
}
思路2:借助陣列,重建鍊錶
/**
* definition for singly-linked list.
* struct listnode ;
*/void
reorderlist
(struct listnode* head)
if(inodelen <=2)
return
;/*宣告初始化陣列*/
struct listnode*
* a=
malloc
(sizeof
(struct listnode*
)*inodelen)
;/*陣列賦值*/
node = head;
for(i=
0;node !=
null
;i++
)/*依據陣列重新連線鍊錶*/
node = head;
for(i=1;
(inodelen-1)
/2-i>=
0;i++
)/*鍊錶末尾指向置空*/
if(inodelen-2*
(i-1)==
1)else
}
143 重排鍊錶
143.重排鍊錶 給定乙個單鏈表 l l0 l1 l n 1 ln 將其重新排列後變為 l0 l n l1 l n 1 l2 l n 2 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。示例 1 給定鍊錶 1 2 3 4,重新排列為 1 4 2 3.示例 2 給定鍊錶 1 2 3 4 ...
143 重排鍊錶
題解 時間複雜度 o n 空間複雜度 o n definition for singly linked list.struct listnode listnode int x val x next nullptr listnode int x,listnode next val x next nex...
143 重排鍊錶
題目 給定乙個單鏈表 l l0 l1 l n 1 ln 將其重新排列後變為 l0 l n l1 l n 1 l2 l n 2 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。示例 1 給定鍊錶 1 2 3 4,重新排列為 1 4 2 3.示例 2 給定鍊錶 1 2 3 4 5,重新排列...