题目:
给你一个链表以及两个权值
v1
和v2
,交换链表中权值为v1
和v2
的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。注意:你需要交换两个节点而不是改变节点的权值
样例:
给出链表 1->2->3->4->null ,以及 v1 = 2 , v2 = 4
返回结果 1->4->3->2->null。
解析:
为了统一处理,加了一个头结点,链表交换处理,需要知道当前结点和前一个结点,第一次的val值等于v1或者v2时,找到第一个结点,此时p1为空,p1赋值为需要交换的第一个结点,pre_p1为前一个节点,第二次val的值等于v1或者v2时,定义一个pos_p2记录后一个结点,两个要交换的结点都找出来了,分两种情况:
- 如果两个结点相邻,直接把p1和p2位置交换一下即可;
- 不相邻,需要考虑中间的结点,p2的后面接中间部分,再接p1,p1后面接pos_p2,完成 。
代码:
ListNode* swapNodes(ListNode* head, int v1, int v2)
{
if (head == nullptr || v1 == v2)
return head;
ListNode* newHead = new ListNode(-1);
newHead->next = head;
ListNode* p1 = nullptr;//指向第一个值
ListNode* p2 = nullptr;//指向第二个值
ListNode* pre_p1 = nullptr;//指向第一个值的前一个节点
ListNode* cur = newHead;
while (cur->next != nullptr)
{
if (cur->next->val == v1 || cur->next->val == v2)
{
if (p1 == nullptr)
{
p1 = cur->next;
pre_p1 = cur;
}
else
{
ListNode* pos_p2 = cur->next->next;//指向第二个值的后一个节点
p2 = cur->next;
pre_p1->next = p2;
if (p1 == cur)//如果p1和p2相邻
{
p2->next = p1;
p1->next = pos_p2;
}
else
{
p2->next = p1->next;
p1->next = pos_p2;
cur->next = p1;
}
return newHead->next;
}
}
cur = cur->next;
}
return newHead->next;
}
此文章转载自:https://blog.csdn.net/baolinq/article/details/73864534