【leetcode hot 100 24】两两交换链表中的节点
解法一:先判断链表是否为空,若为空则直接返回;否则用left
和right
指向第一个和第二个节点,当这两个节点非空时一直执行交换。其中先判断right.next==null
,说明链表为偶数且已经交换完break
;再判断right.next.next==null
,说明链表为奇数且已经交换完break
;否则重新设置left
和right
继续循环。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null){
return head;
}
ListNode left=head, right=head.next;
while(left!=null && right!=null){
int temp = left.val;
left.val = right.val;
right.val = temp;
if(right.next==null){
break;
}
if(right.next.next==null){
break;
}
left = right.next;
right = left.next;
}
return head;
}
}
注意:
- 先判断链表是否为空,若为空则直接返回
- 若
left!=null && right!=null
,则一直交换 - 先判断
right.next==null
,说明链表为偶数且已经交换完break
;再判断right.next.next==null
,说明链表为奇数且已经交换完break
;否则重新设置left
和right
继续循环。
错误原因:只进行了节点内部值的交换,不是节点之间的交换。
解法二:递归
递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。
如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = head.next;
head.next = swapPairs(newHead.next);
newHead.next = head;
return newHead;
}
}
注意:
- 中止条件:
head == null || head.next == null