leetcode题目地址:24. 两两交换链表中的节点
代码随想录题解地址:代码随想录
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
1. 取当前node①,node.next②和node.next.next③三个节点,
令②.next = ①
①.next = ③
一直循环,其退出条件是,①.next = null
2. 设一个空头nullHead,用于①统一操作,②记录return值,③交换节点时需要记录前一个节点(以保证链表的连续),需要用它处理头节点部分的交换,其实也是统一操作的一部分。
nullHead -> ① -> ② ->③ ->④ ->⑤
temp指针指向①,new一个新的空节点存储②的值(以保证链表的连续,此处用实值),用一个新节点存储节点③(以保证链表的连续,此处用指针),用一个新节点存储节点nullHead记为pre。
①.next = ③
②.next = ①
pre.next = ②
得到结果:nullHead -> ② -> ① ->③ ->④ ->⑤
一轮换位结束,调整temp指针与pre指针:
pre = temp(pre = ①)
temp = ③
重复上述操作即可。
public ListNode swapPairs(ListNode head) {
ListNode temp = head;
ListNode nullHead = new ListNode(0);
nullHead.next = head;
ListNode pre = nullHead;
while (temp != null && temp.next != null) { // 此处报错,因为head即temp可能为空,因此null.next不成立,报错。
ListNode ex = new ListNode(temp.next.val);
ListNode nextTemp = temp.next.next;
temp.next = nextTemp;
ex.next = temp;
pre.next = ex;
//print(nullHead);
//System.out.println("temp :"+temp.val);
//System.out.println("pre :"+pre.val);
pre = temp;
temp = nextTemp;
//print(nullHead);
}
return nullHead.next;
}
public void print(ListNode nullHead){
ListNode pre1 = nullHead.next;
while (pre1!=null){
System.out.println("node: "+pre1.val);
pre1 = pre1.next;
}
System.out.println("------------------ ");
}
无
【解题思路】顺清逻辑就行了。
从pre开始,无需new创建实值的节点,逻辑也更清晰一些(刚改了一下,发现我的②node,也不需要是实值node,那其实逻辑几乎是一模一样的,只是交换的顺序不太一样)。
定义:
pre = nullHead
① = temp
② = temp.next
③ = temp.next.next
交换操作:
pre.next = ②
②.next = ①
①.next = ③
重新定位:
pre = ①
temp = ③
【想法】
1. 虚拟头节点思想和我一致。
2. while退出条件:temp != null && temp.next != null 即 只剩一个单独元素就不进行交换操作。
public ListNode swapPairs(ListNode head) {
ListNode temp = head;
ListNode nullHead = new ListNode(0);
nullHead.next = head;
ListNode pre = nullHead;
while (temp != null && temp.next != null) {
ListNode ex = temp.next;
ListNode nextTemp = temp.next.next;
pre.next = ex;
ex.next = temp;
temp.next = nextTemp;
pre = temp;
temp = nextTemp;
}
return nullHead.next;
}
略
1. 一个function里不能包含其他function