鍊錶中每兩個節點交換位置

2021-10-05 01:11:16 字數 1357 閱讀 6646

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...