题目:
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.
题意:
给定一个链表,交换每两个相邻节点,并返回头结点。
算法应该只使用常数级内存空间,不能修改节点值,只有节点本身可以变化;
思路:
定义三个指针变量,分别为prev,cur,next,一次完成相邻两个元素的交换,之后依次后移。
代码:4ms
/** * 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==nullptr || head->next==nullptr){ return head; } ListNode dummy(-1); dummy.next = head; for(ListNode* prev=&dummy, *cur=prev->next, *next=cur->next; next; prev=cur, cur=cur->next, next=cur?cur->next : nullptr){ prev->next = next; cur->next = next->next; next->next = cur; } return dummy.next; } };如下代码更简洁,但是不符合题目要求:
代码:4ms
/** * 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) { ListNode *p = head; while(p && p->next){ swap(p->val, p->next->val); p = p->next->next; } return head; } };