Given a linked list, swap every two adjacent nodes and return its head.
Example:
Given1->2->3->4
, you should return the list as2->1->4->3
.
Note:
- Your algorithm should use only constant extra space.
- You may not modify the values in the list's nodes, only nodes itself may be changed.
题目大意:两两交换节点
C++
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head == nullptr || head->next == nullptr)
return head;
ListNode *p = head, *q, *pre = nullptr;
head = head->next;
while(p != nullptr && p->next != nullptr){
q = p->next;
if(pre != nullptr)
pre->next = q;
pre = p;
p->next = q->next;
q->next = p;
p = p->next;
}
return head;
}
};
Python
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def swapPairs(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next:
return head
p, q, pre = head, head.next, None
head = head.next
while p and p.next:
q = p.next
if pre:
pre.next = q
pre = p
p.next = q.next
q.next = p
p = 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:
ListNode* swapPairs(ListNode* head) {
if(head==NULL)
return head;
ListNode *p,*q;
p=head,q=head->next;
while(q!=NULL){
swap(p->val,q->val);
p=q->next;
if(p==NULL)
break;
q=p->next;
}
return head;
}
};