【說明】:
本文是左程雲老師所著的《程式設計師面試**指南》第二章中「反轉部分單向鍊錶」這一題目的c++復現。
本文只包含問題描述、c++**的實現以及簡單的思路,不包含解析說明,具體的問題解析請參考原書。
感謝左程雲老師的支援。
【題目】:
給定乙個單向鍊錶的頭節點 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
【要求】:
1、如果鍊錶長度為 n,時間複雜度的要求為 o(n),額外的空間複雜度要求為o(1)。
2、如果不滿足1<=from<=to<=n,則不用調整。
【思路】:
整體的思路與鍊錶的反轉是差不多的,但是判斷 from 的前乙個節點和 to 的後乙個節點的位置是有技巧的。
【編譯環境】:
centos6.7(x86_64)
gcc 4.4.7
【實現】:
實現及測試**:
1/*2view code*檔名:lists_reversepart.cpp34
*摘要:單鏈表部分反轉的c++實現5*/
67 #include 8
9using
namespace
std;
1011
struct
node12;
1617 node* reversepart(node *head,int
from,int
to)18
32if(to >len)
33return
head;
3435 node1 = (fpre == null ? head : fpre->next); //
from位置的節點
36 node *node2 = node1->next;
37 node1->next = tpos; //
from->next指向to之後的第乙個節點tpos
38 node *next =null;
39//
反轉from至to之間的節點
40while(node2 != tpos) //
node2為當前;node1為之前;next為之後
4147
if(null != fpre) //
from節點非head節點時
4852
return
node1;53}
5455
void printlists(node *head)
5662 cout <
6465
intmain()
6680 ptr->next = new
node;
81 ptr = ptr->next;
82 ptr->value =i;
83 ptr->next =null;84}
8586 cout << "
before part reversed:
"<
87printlists(head);
88 head = reversepart(head,3,8
);89 cout << "
after remove mid:
"<
90printlists(head);
91return0;
92 }
注:感謝左程雲老師的支援。
反轉部分單向鍊錶
給定乙個單向鍊錶的頭節點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...
反轉部分單向鍊錶
給定乙個單向鍊錶的頭節點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 ...
005 反轉部分單向鍊錶
package com.my.util 單向鍊錶節點 public class singlenode package com.my.suanfa import com.my.util.singlenode 反轉部分單向鍊錶 時間複雜度o n 額外空間複雜度o 1 public class solut...