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.
题目:交换相邻的两个节点,如第一个和第二个交换,第三个和第四个交换。以此类推
-------更新------------2017-11-13 22:33:01
法一:
带个头节点比较好
class Solution { public: ListNode* swapPairs(ListNode* head) { ListNode* dummy=new ListNode(0); dummy->next=head; ListNode* prev=dummy; while(head &&head->next) { ListNode* nn=head->next->next; prev->next=head->next; head->next->next=head; head->next=nn; prev=head; head=nn; } return dummy->next; } };
法二:官网上有人提交的一个方法。引用技巧,不如法一好理解..
ListNode* swapPairs(ListNode* head) { ListNode **pp = &head, *a, *b; while ((a = *pp) && (b = a->next)) { a->next = b->next; b->next = a; *pp = b; pp = &(a->next); } return head; }
递归法: https://leetcode.com/problems/swap-nodes-in-pairs/discuss/
public ListNode swapPairs(ListNode head) { if (head == null || head.next == null) { return head; } ListNode newhd = head.next; head.next = swapPairs(newhd.next); newhd.next = head; return newhd; }