Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given 1->2->3->4
, you should return the list as 2->1->4->3
.
Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.
这道题目就是考察一个对于单链表轮换的问题,只要弄清楚指针指向对象的顺序问题,然后调用递归就可以解决问题了。
注意点:1.链表问题一定要考虑head指向的是一个空链表,既NULL,必须先加以判断,同样这是递归的终止条件。
2.考虑到链表的元素的奇、偶性,如果最后只剩一个元素,也是终止递归,返回这个元素的值。
代码还是很简单的:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *swapPairs(ListNode *head) {
if (head == NULL)
return NULL;
if (head -> next == NULL)
return head;
ListNode *tmp = head -> next;
head -> next = swapPairs(tmp -> next);
tmp -> next = head;
return tmp;
}
};
第一次写的时候,写错了,出现了无限循环的情况,原因是我对于轮换的顺序上没有写对,把错误代码也附上,做一个错误警示。
ERROR!!!
class Solution {
public:
ListNode *swapPairs(ListNode *head) {
if (head == NULL)
return NULL;
if (head -> next == NULL)
return head;
ListNode *tmp = head -> next;
head -> next -> next = head; //这里已经改变了tmp指向内容的next
head -> next = swapPairs(tmp -> next);//这里会形成一个循环指向自己的情况,根本跳不出递归。
return tmp;
}
};