Leetcode算法Java全解答–24. 两两交换链表中的节点
题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
想法
声明三个变量存储
cur–当前node,preCur–上一个node,preDoubleCur–上一个node的上一个node
声明循环次数num,偶数次的时候就交换
循环,交换
时间复杂度/空间复杂度: n/1
假设数据为,1,2,3,4,5,6,已经循环到4这个数据
cur: val = 4,next=5
preCur: val = 3,next=4
preDoubleCur: val = 2,next=3
交换方式:
ListNode tmpCur = cur;
cur = cur.next;
preDoubleCur.next = tmpCur;
tmpCur.next = preCur;
preCur.next = cur;
结果
超过70%的测试案例
时间复杂度/空间复杂度: n/1
总结
代码
我的答案
/**************************************
* 题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
**************************************/
/**************************************
*
* 想法:
* 1. 声明三个变量存储 cur--当前node,preCur--上一个node,preDoubleCur--上一个node的上一个node
* 声明循环次数num,偶数次的时候就交换
* 循环,交换
*
* 时间复杂度/空间复杂度: n/1
* 假设数据为,1,2,3,4,5,6,已经循环到4这个数据
* cur: val = 4,next=5
* preCur: val = 3,next=4
* preDoubleCur: val = 2,next=3
*
* 交换方式:
* ListNode tmpCur = cur;
* cur = cur.next;
*
* preDoubleCur.next = tmpCur;
* tmpCur.next = preCur;
* preCur.next = cur;
*
*
*
* 我的做法
* 超过70%的测试案例
* 时间复杂度/空间复杂度: n/1
* 代码执行过程:
*
* 总结:
*
* ***********************************/
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode result = head.next;
ListNode cur = head;
ListNode preCur = head;
ListNode preDoubleCur = head;
int num = 0;
while (cur != null) {
num++;
if (num % 2 == 0) {
ListNode tmpCur = cur;
cur = cur.next;
preDoubleCur.next = tmpCur;
tmpCur.next = preCur;
preCur.next = cur;
continue;
}
preDoubleCur = preCur;
preCur = cur;
cur = cur.next;
}
return result;
}
大佬们的答案
public ListNode better(ListNode head) {
ListNode mid;
ListNode ans;
if (head == null || head.next == null) {
return head;
}
ans = head.next;
while (true) {
mid = head.next;
head.next = head.next.next;
mid.next = head;
if (head.next != null && head.next.next != null) {
mid = head.next;
head.next = head.next.next;
head = mid;
} else {
head = head.next;
break;
}
}
return ans;
}
测试用例
@Test
public void test024() {
// 创建测试案例
ListNode listNode11 = new ListNode(1);
ListNode listNode12 = new ListNode(2);
ListNode listNode13 = new ListNode(3);
ListNode listNode14 = new ListNode(4);
listNode11.next = listNode12;
listNode12.next = listNode13;
listNode13.next = listNode14;
// 测试案例期望值
ListNode expResult1 = new ListNode(2);
ListNode expResult12 = new ListNode(1);
ListNode expResult13 = new ListNode(4);
ListNode expResult15 = new ListNode(3);
expResult1.next = expResult12;
expResult12.next = expResult13;
expResult13.next = expResult15;
Solution024 solution024 = new Solution024();
ListNode result1 = solution024.swapPairs(listNode11);
Assert.assertEquals(expResult1.toArray(), result1.toArray());
}
其他
代码托管码云地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git
查看其他内容可以点击专栏或者我的博客哈:https://blog.csdn.net/cmqwan
“大佬们的答案” 标签来自leetcode,侵权请联系我进行删改
如有疑问请联系,联系方式:QQ3060507060