反轉部分單向鍊錶

2022-04-06 00:07:42 字數 2036 閱讀 2143

【說明】:

本文是左程雲老師所著的《程式設計師面試**指南》第二章中「反轉部分單向鍊錶」這一題目的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/*2

*檔名: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 }

view code

注:感謝左程雲老師的支援。

反轉部分單向鍊錶

給定乙個單向鍊錶的頭節點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...