两两交换链表中的节点
2017-03-30 16:37
239 查看
题目:
给一个链表,两两交换其中的节点,然后返回交换后的链表。
样例:
给出
挑战:
你的算法只能使用常数的额外空间,并且不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路:
将链表中的结点分组,四个一组,在每一组中,第一个结点的next指向第四个结点,第二个结点的next指向第一个结点,此组操作完成,将head移动到第三个结点,,此时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
ListNode *q;
ListNode *p=head->next;
if(head==NULL||head->next==NULL) return head;
else { while(head!=NULL&&head->next!=NULL){
ListNode *node=head->next;
ListNode *r=node->next;
if(r==NULL){
head->next=NULL;
node->next=head;
head=r;
}
else {
head->next=r->next;
node->next=head;
q=head;
head=r;
}
}
if(head!=NULL){
q->next=head;
}
}
return p;
}
};
感想:
要实际地进行结点交换来实现两两交换链表中的节点,其实就是将链表中的四个结点一组,改变前两个结点的next,再将head移动到第三个结点,重复上面的操作,最后结束的时候要判断是不是还剩一个节点,如果是要把该节点插入到链表中。
给一个链表,两两交换其中的节点,然后返回交换后的链表。
样例:
给出
1->2->3->4, 你应该返回的链表是
2->1->4->3。
挑战:
你的算法只能使用常数的额外空间,并且不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路:
将链表中的结点分组,四个一组,在每一组中,第一个结点的next指向第四个结点,第二个结点的next指向第一个结点,此组操作完成,将head移动到第三个结点,,此时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
ListNode *q;
ListNode *p=head->next;
if(head==NULL||head->next==NULL) return head;
else { while(head!=NULL&&head->next!=NULL){
ListNode *node=head->next;
ListNode *r=node->next;
if(r==NULL){
head->next=NULL;
node->next=head;
head=r;
}
else {
head->next=r->next;
node->next=head;
q=head;
head=r;
}
}
if(head!=NULL){
q->next=head;
}
}
return p;
}
};
感想:
要实际地进行结点交换来实现两两交换链表中的节点,其实就是将链表中的四个结点一组,改变前两个结点的next,再将head移动到第三个结点,重复上面的操作,最后结束的时候要判断是不是还剩一个节点,如果是要把该节点插入到链表中。
相关文章推荐
- 【LintCode 简单】451. 两两交换链表中的节点
- 两两交换链表中的节点
- LintCode:两两交换链表中的节点
- 两两交换链表中的节点
- 两两交换链表中的节点-LintCode
- 两两交换链表中的节点
- 两两交换链表中的节点 - C++
- 两两交换链表中的节点
- 两两交换链表中的节点
- 两两交换链表中的节点
- 451. 两两交换链表中的节点(swap-nodes-in-pairs)(c++)----lintcode面试题之链表
- 两两交换链表中的节点
- Java实现-两两交换链表中的节点
- 作业4.451:两两交换链表中的节点
- [LintCode 451] 两两交换链表中的节点(Python)
- 两两交换链表中的节点
- 两两交换链表中的节点-LintCode
- LintCode 两两交换链表中的节点
- 两两交换链表中的节点
- lintcode——两两交换链表中的节点