Python
参考:https://leetcode.cn/problems/swap-nodes-in-pairs/?envType=study-plan-v2&envId=top-100-liked:
# self.val = val
# self.next = next
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
if head == None or head.next == None:
return head
newHead = head.next
head.next = self.swapPairs(newHead.next)
newHead.next = head
return newHead
迭代
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head or not head.next:
return head
dummy = ListNode(-1)
dummy.next = head
pre = dummy
cur = pre.next
while cur and cur.next:
nxt = cur.next.next
pre.next = cur.next
cur.next.next = cur
cur.next = nxt
pre = pre.next.next
cur = pre.next
return dummy.next
Java
法1:迭代
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode pre = null, cur = head, newHead = null;
while (cur != null) {
ListNode next = cur.next;
if (next == null) { // 奇数个结点数量
break;
}
ListNode tmp = next.next; // 下一组的起点
if (pre == null) {
next.next = cur;
cur.next = tmp;
newHead = next; // 新起点
} else {
pre.next = next;
next.next = cur;
cur.next = tmp;
}
pre = cur;
cur = tmp;
}
return newHead;
}
}
法2:迭代
跟迭代版翻转链表,异曲同工之妙!!!
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;
}
}