Leetcode递归问题C++版本
两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3 |
---|
解题思路:
1.数据结构为链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
2.数据两两对调
1->2 ====> 2->1
如果以两个数据为一个整体,则会出现数据链丢数据的问题。故需要注意。
解题答案:
void swaps(ListNode* head){
if(head->next && head->next->next)
//此处添加head->next->next判断是为了防止输入的数据不是偶数个
{
ListNode *l = head->next->next;
head->next->next = l->next;
l->next = head->next;
head->next = l;
swaps(l->next);
//此时l->next指向一组数据中的最后一个元素(例如2->3->4中的4)
}else{
return;
}
}
ListNode* swapPairs(ListNode* head) {
if(head&&head->next){
ListNode *l = head->next;
head->next = l->next;
l->next = head;
head = l;
if(head->next->next)
swaps(head->next);
//第一次输入时,以第一二个位置为单位。
//以后的数据以第二个第三个第四个数据为一组,防止数据链断裂
}
return head;
}
外部代码:
int main(){
ListNode *s = (ListNode *)malloc(sizeof(ListNode));
ListNode *p1 = (ListNode *)malloc(sizeof(ListNode));
ListNode *p2 = (ListNode *)malloc(sizeof(ListNode));
ListNode *p3 = (ListNode *)malloc(sizeof(ListNode));
s->val = 1;
p1->val = 2;
p2->val = 3;
p3->val = 4;
s->next = p1;
p1->next = p2;
p2->next = p3;
p3->next = NULL;
ListNode *l = swapPairs(s);
while(l){
if(!l->next)
cout<<l->val<<endl;
else
cout<<l->val<<"->";
l = l->next;
}
}