交换链表当中两个节点c语言,[LintCode] Swap Two Nodes in Linked List 交换链表中的两个结点...

Given a linked list and two values v1 and v2. Swap the two nodes in the linked list with values v1 and v2. It's guaranteed there is no duplicate values in the linked list. If v1 or v2 does not exist in the given linked list, do nothing.

Notice

You should swap the two nodes with values v1 and v2. Do not directly swap the values of the two nodes.

Example

Given 1->2->3->4->null and v1 = 2, v2 = 4.

Return 1->4->3->2->null.

LeetCode上有一道类似的题目Swap Nodes in Pairs,但是又不太一样。这道题其实难度适中,但是需要注意的地方不少。首先需要交换的两个结点有可能是相邻的两个结点,而且有可能v1在v2后面,也有可能首结点就需要交换,那么我们还是一如既往的先设一个dummy结点,后面连上首结点,我们的思路是遍历整个链表,如果cur的下一个结点存在,且等于v1或v2中的一个,此时如果p1为空,说明这是要交换的第一个结点,我们将p1指向这个结点,然后讲pre指向cur,交换操作需要记录要交换的结点的前一个位置,然后继续遍历,当又遇到一个和v1或v2相等的结点,此时我们就需要交换了,我们用p2指向这个结点,然后用临时变量t指向下一个结点,此时我们需要判断cur和p1是相等,相等的话说明p1和p2是相邻的,我们只需要把p2移到p1前面去,如果不相等,说明p1和p2之间还有元素,那么我们交换p1和p2的位置即可,最后返回dummy->next即可:

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) {

ListNode *dummy = new ListNode(-);

dummy->next = head;

ListNode *pre = dummy, *cur = dummy, *p1 = NULL, *p2 = NULL;

while (cur->next) {

if (cur->next->val == v1 || cur->next->val == v2) {

if (!p1) {

p1 = cur->next;

pre = cur;

} else {

ListNode *t = cur->next->next;

p2 = cur->next;

pre->next = p2;

if (cur == p1) {

p2->next = p1;

p1->next = t;

} else {

p2->next = p1->next;

cur->next = p1;

p1->next = t;

}

return dummy->next;

}

}

cur = cur->next;

}

return dummy->next;

}

};

LeetCode 24. Swap Nodes in Pairs(交换链表中每两个相邻节点)

题意:交换链表中每两个相邻节点,不能修改节点的val值. 分析:递归.如果以第三个结点为头结点的链表已经两两交换完毕(这一步递归实现---swapPairs(head -> next -> ...

LintCode "Swap Two Nodes in Linked List"

Nothing special. Just take care of corner cases. class Solution { public: /** * @param head a ListNo ...

LeetCode 24. 两两交换链表中的节点(Swap Nodes in Pairs)

题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 说明: 你的算法只能 ...

用C语言把双向链表中的两个结点交换位置,考虑各种边界问题。

用C语言把双向链表中的两个结点交换位置,考虑各种边界问题. [参考] http://blog.csdn.net/silangquan/article/details/18051675

lintcode-451-两两交换链表中的节点

451-两两交换链表中的节点 给一个链表,两两交换其中的节点,然后返回交换后的链表. 样例 给出 1->2->3->4, 你应该返回的链表是 2->1->4->3. ...

NO.24两两交换链表中的节点

NO.24两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例:给定 1->2->3-&g ...

Java实现 LeetCode 24 两两交换链表中的节点

24. 两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3-&g ...

24. Swap Nodes in Pairs[M]两两交换链表中的节点

题目 Given a linked list, swap every two adjacent nodes and return its head. You may not modify the va ...

【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)

目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...

随机推荐

centos6 install mcrypt

Download the latest epel-release rpm from http://dl.fedoraproject.org/pub/epel/6/x86_64/ Install epe ...

从下往上看--新皮层资料的读后感 第三部分 70年前的逆向推演- 从NN到ANN

第三部分 NN-ANN 70年前的逆向推演 从这部分开始,调整一下视角主要学习神经网络算法,将其与生物神经网络进行横向的比较,以窥探一二. 现在基于NN的AI应用几乎是满地都是,效果也不错,这种貌似神 ...

iphone 手机屏幕和UIView和UIWindowde 的主要的区别

在iPhone5之前的iphone1,2,3,3s,4,4s都是320x480 iPhone5和5s的屏幕是320x568 iphone6的屏幕是375x667 iPhone6Plus的414x736 ...

遇到的 autoresizingMask 相关的问题

1.前言 当一个控件设置好 frame,然后出现会 frame 显示不准或是跟随父控件的变化而变化了,你就要考虑是否是 autoresizing 的问题了 当在 xib 中布局时,报 NSAutore ...

hdu 2711&&poj2182 Lost Cows (线段树)

从后往前查第一个为0的奶牛肯定应该排在第一个.每次从后往前找到第一个为0的数,这个数应该插在第j位.查找之后,修改节点的值为极大值,当整棵树的最小值不为0的时候查找结束. 至于这种查找修改的操作,再没 ...

JAVA队列的使用

JAVA队列的使用 今天跟大家来看看如何在项目中使用队列.首先我们要知道使用队列的目的是什么?一般情况下,如果是一些及时消息的处理,并且处理时间很短的情况下是不需要使用队列的,直接阻塞式的方法调用就可 ...

Django templates and models

models templates models and databases models 如何理解models A model is the single, definitive source of ...

write something

今天是2013年7月8日了. 办公室里灯光很柔和,但是雨后的窗外让天空很亮,光线乘机也溜了进来. 偶尔想去联系某个人,点开了她的资料,进去了她的博客.看了这几年来为数不多不的几篇博客.可以看到一个人的 ...

k8s rc

RC是用来管理Pod的,每个RC由一个或多个Pod组成:在RC被创建之后,系统将会保持RC中的可用Pod的个数与创建RC时定义的Pod个数一致,如果Pod个数小于定义的个数,RC会启动新的Pod,反之 ...

学习笔记之glog的使用

下载源码,使用cmake编译,最后得到了32位的静态库 glog.lib 使用库时要注意添加以下预定义: GLOG_NO_ABBREVIATED_SEVERITIES; GOOGLE_GLOG_DLL ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值