LintCode:交换链表当中两个节点
2016-12-06 12:33
225 查看
给你一个链表以及两个权值
注意事项
你需要交换两个节点而不是改变节点的权值
您在真实的面试中是否遇到过这个题?
Yes
样例
给出链表
返回结果
标签
链表
/**
* 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
* @oaram v1 an integer
* @param v2 an integer
* @return a new head of singly-linked list
*/
ListNode* swapNodes(ListNode* head, int v1, int v2) {
// Write your code here
ListNode* plist = head;
ListNode* p1r=NULL,*p2r=NULL,*p1n=NULL, *p2n=NULL;
ListNode* p1 = NULL, *p2 = NULL;
if(head==NULL)
return head;
ListNode* pr = NULL;
while(plist != NULL)
{
if(plist->val == v1 || plist->val == v2)
{
if(p1 == NULL)//前一个节点
{
p1r = pr;
p1 = plist;
}
else //后一个节点
{
p2r = pr;
p2 = plist;
p2n = p2->next;
if(p1->next == p2)//两个节点连续
{
p1->next = p2->next;
p2->next = p1;
if(p1r != NULL)//如果第一个节点不是头节点
p1r->next = p2;
else
return p2;//第一个节点是头节点,返回p2
}
else
{
if(p1r != NULL)//如果第一个节点不是是头节点
p1r->next = p2;
p2->next = p1->next; //交换节点需要用到两个节点指针以及他们前一节点指针
p2r->next = p1; //还需要其中一个后面的指针
p1->next = p2n;
if(p1r == NULL)
return p2;//第一个节点是头节点,返回p2
}
return head; //交换之后直接返回
}
}
pr = plist;
plist = plist->next;
}
return head;
}
};
v1和
v2,交换链表中权值为
v1和
v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。
注意事项
你需要交换两个节点而不是改变节点的权值
您在真实的面试中是否遇到过这个题?
Yes
样例
给出链表
1->2->3->4->null,以及
v1=
2,
v2=
4
返回结果
1->4->3->2->null。
标签
链表
/**
* 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
* @oaram v1 an integer
* @param v2 an integer
* @return a new head of singly-linked list
*/
ListNode* swapNodes(ListNode* head, int v1, int v2) {
// Write your code here
ListNode* plist = head;
ListNode* p1r=NULL,*p2r=NULL,*p1n=NULL, *p2n=NULL;
ListNode* p1 = NULL, *p2 = NULL;
if(head==NULL)
return head;
ListNode* pr = NULL;
while(plist != NULL)
{
if(plist->val == v1 || plist->val == v2)
{
if(p1 == NULL)//前一个节点
{
p1r = pr;
p1 = plist;
}
else //后一个节点
{
p2r = pr;
p2 = plist;
p2n = p2->next;
if(p1->next == p2)//两个节点连续
{
p1->next = p2->next;
p2->next = p1;
if(p1r != NULL)//如果第一个节点不是头节点
p1r->next = p2;
else
return p2;//第一个节点是头节点,返回p2
}
else
{
if(p1r != NULL)//如果第一个节点不是是头节点
p1r->next = p2;
p2->next = p1->next; //交换节点需要用到两个节点指针以及他们前一节点指针
p2r->next = p1; //还需要其中一个后面的指针
p1->next = p2n;
if(p1r == NULL)
return p2;//第一个节点是头节点,返回p2
}
return head; //交换之后直接返回
}
}
pr = plist;
plist = plist->next;
}
return head;
}
};
相关文章推荐
- LintCode 交换链表当中两个节点
- LintCode 交换链表当中两个节点
- LintCode:交换链表当中两个节点
- LINTCODE——交换链表当中两个节点
- lintcode:交换链表当中两个节点
- LintCode-交换链表当中两个节点
- lintcode-511-交换链表当中两个节点
- 交换链表当中两个节点-LintCode
- Java实现-交换链表当中的两个节点
- 511- 交换链表当中两个节点
- 交换链表当中两个节点
- 【LintCode 简单】451. 两两交换链表中的节点
- lintcode-451-两两交换链表中的节点
- [小算法] 交换链表中的两个节点
- 单链表相邻两个节点之间交换顺序
- 451. 两两交换链表中的节点(swap-nodes-in-pairs)(c++)----lintcode面试题之链表
- 两两交换链表中的节点-LintCode
- LintCode 两两交换链表中的节点
- [LintCode] Swap Two Nodes in Linked List 交换链表中的两个结点
- python_lintcode_737. Find Elements in Matrix_451. 两两交换链表中的节点