问题描述:
给一个链表,两两交换其中的节点,然后返回交换后的链表。
样例:
给出
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) {}
* };
*/
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 *p;
ListNode *q;
p= head;
q= p->next;
int a;
while (q!= NULL &&p!= NULL) {
a= p->val;
p->val= q->val;
q->val= a;
if (q->next== NULL)break; //判断后面是否还有元素
p= q->next;
if (p->next== NULL)break; //判断后面的元素是否只剩下一个
q= p->next;
}
return head;
}
};
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
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 *p;
ListNode *q;
p= head;
q= p->next;
int a;
while (q!= NULL &&p!= NULL) {
a= p->val;
p->val= q->val;
q->val= a;
if (q->next== NULL)break; //判断后面是否还有元素
p= q->next;
if (p->next== NULL)break; //判断后面的元素是否只剩下一个
q= p->next;
}
return head;
}
};
感想:
原本想的是直接将链表两两交换,但是 这个太麻烦而且得需要好几个指针储备,但是如果不动链表顺序的话只能就交换数据,这样就会显得方便而且算法比较简单。但是在实现过程经常漏掉细节,譬如循环里面的判断语句没有的话就是出现runtime error 这个错误,如果链表后面明明没有数据,但是偏偏要用后面的数据,这样就是就会出错。