交换链表当中两个节点
2016-07-13 09:53
459 查看
题目
给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。注意事项
你需要交换两个节点而不是改变节点的权值
解题
找到这两个结点的前驱节点node1Prev node1
node2Prev node2 node2Next
利用上面五个结点进行链接
node1Prev.next = node2;
node2.next = node1.next;
node2Prev.next = node1;
node1.next = node2Next;
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { /** * @param head a ListNode * @oaram v1 an integer * @param v2 an integer * @return a new head of singly-linked list */ public ListNode swapNodes(ListNode head, int v1, int v2) { // Write your code here ListNode dummy = new ListNode(0);// 添加头结点 dummy.next = head; ListNode node1Prev = null, node2Prev = null; ListNode cur = dummy; while (cur.next != null) { if (cur.next.val == v1) { node1Prev = cur; } else if (cur.next.val == v2) { node2Prev = cur; } cur = cur.next; } if (node1Prev == null || node2Prev == null) { return head; } if (node2Prev.next == node1Prev) { // 链接情况 // make sure node1Prev is before node2Prev ListNode t = node1Prev; node1Prev = node2Prev; node2Prev = t; } ListNode node1 = node1Prev.next; ListNode node2 = node2Prev.next; ListNode node2Next = node2.next; if (node1Prev.next == node2Prev) { node1Prev.next = node2; node2.next = node1; node1.next = node2Next; } else { node1Prev.next = node2; node2.next = node1.next; node2Prev.next = node1; node1.next = node2Next; } return dummy.next; } }
相关文章推荐
- 线索二叉树
- Nginx启动报错误unlink() “nginx.pid” failed (2: No such file or directory)
- 简单的写文本日志方法
- 李洪强iOS开发支付集成之银联支付
- 一个神奇的控件——Android CoordinatorLayout与Behavior使用指南
- xmlns:app="http://schemas.android.com/apk/res-auto"找不到?
- Unity3d如何制作声音开关按钮
- 各种算法和数据结构
- POJ 1655 Balancing Act
- Linux上Redis的安装过程以及注意事项
- Objective C类方法load和initialize的区别
- 以SpringMVC框架为中心疯狂扩展-01、Maven搭建webapp
- cordova iOS平台的插件开发
- css之absolute
- mkdir命令(建立一个目录) rmdir命令(删除一个目录) rm命令(删除文件)
- 【HDU3247】 Resource Archiver(DP+AC自动机+最短路)
- Git 常用命令
- Mysql 数据库crash恢复
- StringBuffer类的简入
- Html中使用自定义图片来实现checkbox显示