地址:http://oj.leetcode.com/problems/swap-nodes-in-pairs/
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.
思路:基本数据结构的操作,WA了几次,还是不熟。要多写写才好。
参考代码:
class Solution {
public:
ListNode *swapPairs(ListNode *head) {
if(!head)
{
return head;
}
ListNode *p1 = head, *p2 = head->next, *cur=head;
if(!p2)
{
return head;
}
head = p2;
p1->next = p2->next;
p2->next = p1;
cur = p1;
while(p1->next)
{
p1 = p1->next;
p2 = p1->next;
if(p2)
{
p1->next = p2->next;
p2->next = p1;
cur->next = p2;
cur = p1;
}
}
return head;
}
};
python参考代码:
把原来的list split成了两个sub list,然后再merge一下,现在回想一个月前用c++实现的没有split的做法好牛逼啊。。。
遇上这样的题一定要冷静
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# @param a ListNode
# @return a ListNode
def swapPairs(self, head):
if not head or not head.next: return head
p1 = h1 = head
p2 = h2 = head.next
while p1 and p2:
p1.next = p2.next
p1 = p1.next
if not p1: break
p2.next = p1.next
p2 = p2.next
nxt1 = p1 = h2
nxt2 = p2 = h1
while p1 and p2:
nxt1 = p1.next
nxt2 = p2.next
p1.next = p2
if nxt1:
p2.next = nxt1
p1 = nxt1
p2 = nxt2
return h2
//SECOND TRIALclass Solution {public :ListNode * swapPairs ( ListNode * head ) {if ( ! head || ! head -> next )return head ;ListNode * l1 = head , * l2 = head -> next ;ListNode * p1 = l1 , * p2 = l2 , * nxt1 = NULL , * nxt2 = NULL ;while ( p1 && p2 ){p1 = p1 -> next = p2 -> next ;if ( p1 )p2 = p2 -> next = p1 -> next ;}p1 = l1 ;p2 = l2 ;while ( p1 && p2 ){nxt1 = p1 -> next ;nxt2 = p2 -> next ;p2 -> next = p1 ;if ( nxt2 ){p2 = p1 -> next = nxt2 ;p1 = nxt1 ;}elsebreak ;}return l2 ;}};