24. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
一开始看到这道题没有想到递归,迭代想了好久才有思路。写完才发现递归应该更简单才对。
递归
-
思路
考虑两个节点以上情况。我们首先可以确定的是第二个节点的下一个节点是第一个节点,而第一个节点的下一个节点是不确定的,但我们可以通过用同样的方法与后面符合条件的节点连接,这个思路下就用到了递归。
代码 -
代码
class Solution { public: ListNode* swapPairs(ListNode* head) { if(head!=NULL&&head->next!=NULL){ ListNode* nex=head->next; head->next=swapPairs(nex->next); nex->next=head; return nex; } else{ return head; } } };
迭代
-
思路
这里主要用到了哨兵指针,及头指针。它用来作为迭代的对象保证循环按我想的的顺序进行。 -
代码
class Solution { public: ListNode* swapPairs(ListNode* head) { istNode* node = new ListNode(0,head); ListNode* q=node; for(ListNode* e=q;e->next!=NULL&&e->next->next!=NULL;){ ListNode* node1=e->next->next; ListNode* node2=e->next; e->next=node1; node2->next=node1->next; node1->next=node2; e=node2; } return node->next; } };