题目描述:

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

给定 1->2->3->4,你应该返回 2->1->4->3.

注意事项

1、不能简单的交换数值,而是需要更改指针,即确实更改了节点;

2、如果节点个数是奇数,如下图:



那么第5个节点不用交换。只需变成如下图所示链表即可:

但是再考虑节点个数的奇偶,逻辑会比较麻烦;

3、在交换的过程中指针的指向如何更改也是一个问题。

如何交换

以交换3和4为例;



需要进行如下几步操作:

将2节点的next域指向4节点;

将4节点的next域指向3节点;

将3节点的next域指向5节点。

所以可以定义一个交换函数,传进2节点去,记为pre,pre的next域指向的节点(此案例中为3节点)定义为next,

所以分析的步骤即为

        //定义一个保存pre.next的节点
ListNode next = pre.next;
//将pre节点的next域指向pre后两个节点
pre.next = next.next;
//prer后一个节点的next域指向pre的后3个节点
next.next = next.next.next;
//在原始状态下时pre的后两个节点的next指向pre的后一个节点
pre.next.next = next;

可以看图分析过程:

判断是否交换并移动pre

        //1、判断是否交换
while(pre.next != null && pre.next.next != null){
swap(pre);
//2、指针向后移动两个
pre = pre.next.next;
}

对判断是否交换的一些说明:

如果pre的后一个节点与后两个节点都非空,则进行交换。

完整代码

class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre= dummy;
while(pre.next != null && pre.next.next != null){
swap(pre);
pre = pre.next.next;
}
return dummy.next;
} public void swap(ListNode pre){
ListNode next = pre.next;
pre.next = next.next;
next.next = next.next.next;
pre.next.next = next;
}
}

对代码的一些说明:

1、dummy节点用来表示head的前驱节点,是一个伪节点;

2、最后返回伪节点的next域指向的节点。

欢迎关注

扫下方二维码即可关注:

最新文章

  1. yii的csv导出
  2. JQuery实战图片特效-遁地龙卷风
  3. nc 显示服务器开放的端口
  4. oracle数据库如何创建角色并对角色授予权限
  5. 努力学习 HTML5 (4)—— 浏览器对语义元素的支持情况
  6. [译] 第三十天:Play Framework - Java开发者梦寐以求的框架 - 百花宫
  7. Android WIFI 启动流程
  8. 新增tab页无法获取到数据,原来是URL的rewrite配置文件忘了修改
  9. js与uri中location关系
  10. kNN
  11. 转:对于linux下system()函数的深度理解(整理)
  12. linux杂记(七)linux档案与目录管理指令
  13. 1305 Pairwise Sum and Divide
  14. Linux下利用expect,不用交互模式,直接登陆远程主机
  15. Spring基础系列--AOP织入逻辑跟踪
  16. python-shogun安装问题
  17. 部落划分Group[JSOI2010]
  18. [PKUWC2018] Slay the spire
  19. css3 animation 在某些浏览器中特别快 bugfix
  20. mysql ibdata1

热门文章

  1. 浮动( Floats )
  2. nfs存储(一)
  3. 893C. Rumor#谣言传播(赋权无向图&搜索)
  4. bat文件设置ip自动和静态ip切换
  5. idea新建maven项目后生成web.xml方法和添加到tomcat方法
  6. 三、linux-mysql mysql的多实例
  7. 数据结构与算法——认识O(NlogN)的排序(2)
  8. 吴裕雄--天生自然 JAVA开发学习:发送邮件
  9. iOS MJRefresh的使用 (列表上拉加载更多)
  10. 【转】Vim命令合集