451. 两两交换链表中的节点(swap-nodes-in-pairs)(c++)----lintcode面试题之链表

xiaoxiao2021-02-28  21

(一)题目要求:

给一个链表,两两交换其中的节点,然后返回交换后的链表。

(二)示例:

给出 1->2->3->4, 你应该返回的链表是 2->1->4->3

你的算法只能使用常数的额外空间,并且不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

(三)题解:

方法一:

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ //方法一:引入头结点,两辆交换结点,注意交换顺序: //(1)保存第二个结点的指针 //(2)第一个结点指向第二个结点的下一个结点 //(3)把第二结点插入第一个结点前 //(4)head指针后移到交换后的第二个结点 class Solution { public: /* * @param head: a ListNode * @return: a ListNode */ ListNode * swapPairs(ListNode * head) { // write your code here ListNode Dummy(0); Dummy.next = head; head = &Dummy; while(head->next && head->next->next) { ListNode *sec_node = head->next->next; head->next->next = sec_node->next; sec_node->next = head->next; head->next = sec_node; head = head->next->next; } return Dummy.next; } };

方法二:

//方法二:思路和方法一基本一致,只是具体处理细节不同 //(1)保存下一个要处理结点的指针 //(2)前结点指向第二个结点 //(3)当前处理结点指针后移 //(4)第二个结点指向原第一个结点 //(5)当前处理指针后移(指向交换后的第二个结点) //(6)交换后的第二个结点指向NULL //(7)ret指向下一个要处理的结点 //(8)循环结束后如果有单个结点存在,还需使当前节点指向这个结点 class Solution { public: /** * @param head a ListNode * @return a ListNode */ ListNode* swapPairs(ListNode* head) { // Write your code here if(head==NULL || head->next==NULL) return head; ListNode *helper=new ListNode(0); ListNode *ret=head; ListNode *cur=helper; while(ret && ret->next) { ListNode *next=ret->next->next; cur->next=ret->next; cur=cur->next; cur->next=ret; cur=cur->next; cur->next=NULL; ret=next; } if(ret) cur->next=ret; return helper->next; } };
转载请注明原文地址: https://www.6miu.com/read-2624973.html

最新回复(0)