leetcode上的一道兩兩交換鍊錶節點的題目:如下
給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。使用迭代法求解時遇到了乙個想了一晚上的問題,記錄如下:你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例:給定 1->2->3->4, 你應該返回 2->1->4->3.
首先,官方給出的題解如下:
/**
* definition for singly-linked list.
* public class listnode
* }*/class solution
// return the new head node.
return dummy.next;
}}
我使用c++進行重寫後得到如下的**:
listnode* prenode = new listnode(-1,null);
prenode->next = head;
listnode* hh = new listnode(1,null);
/*********注意下面這一行*******/
hh->next = head ;
/*********注意上面這一行*******/
while (head != null && head->next != null)
return hh->next;
}
注意到上面**的第六行,在第六行中我沒有採用題解中的hh=prenode的寫法,這裡導致了交換後hh->next指向的是值為1的第二個節點,而不是值為2的第乙個節點,導致輸入樣例的輸出為1 4 3而非2 1 4 3。
正確的c++**寫法如下:
listnode* prenode = new listnode(-1,null);
prenode->next = head;
listnode* hh = new listnode(1,null);
hh = prenode ;
while (head != null && head->next != null)
return hh->next;}
另外此題還有一種遞迴解法(非常優雅,也可能是我寫不出來的那種。。。。):
if ((head == null) || (head->next = null))
listnode* firstnode = head;
listnode* secondnode = head->next;
secondnode->next = firstnode;
return secondnode;}
交換鍊錶節點(每兩個節點交換一次位置)
將給定的鍊錶中每兩個相鄰的節點交換一次,返回鍊錶的頭指標 例如,給出1 2 3 4,你應該返回鍊錶2 1 4 3。你給出的演算法只能使用常量級的空間。你不能修改列表中的值,只能修改節點本身。function listnode x param head listnode類 return listnod...
交換兩個鍊錶節點
在鍊錶有關的問題當中,鍊錶節點交換是乙個非常 典型的一道題目,先給 後總結。include using namespace std struct node node create int n,int data return head void display node head cout endl ...
交換鍊錶當中兩個節點
給你乙個鍊錶以及兩個權值v1和v2,交換鍊錶中權值為v1和v2的這兩個節點。保證鍊錶中節點權值各不相同,如果沒有找到對應節點,那麼什麼也不用做。注意事項 你需要交換兩個節點而不是改變節點的權值 找到這兩個結點的前驅節點 node1prev node1 node2prev node2 node2nex...