给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100
void main() {
ListNode? list = ListNode();
ListNode? head = list;
list.next = ListNode(1);
list = list.next;
list?.next = ListNode(2);
list = list?.next;
list?.next = ListNode(3);
list = list?.next;
list?.next = ListNode(4);
list = list?.next;
ListNode? result = swapPairs(head.next);
while (result != null) {
print("result ${result.val}");
result = result.next;
}
// ListNode? result2 = swapPairs2(head.next);
// while (result2 != null) {
// print("result2 ${result2.val}");
// result2 = result2.next;
// }
}
ListNode? swapPairs(ListNode? head) {
ListNode? tempResult = ListNode();
ListNode? result = tempResult;
while (head != null && head.next != null) {
ListNode? temp = head;
ListNode? temp2 = head.next;
head = head.next?.next;
tempResult?.next = temp2;
tempResult = tempResult?.next;
tempResult?.next = temp;
tempResult = tempResult?.next;
tempResult?.next = null;
}
if (head != null) {
tempResult?.next = head;
tempResult = tempResult?.next;
}
return result.next;
}
// 递归法:
ListNode? swapPairs2(ListNode? head) {
return doSwap(head);
}
ListNode? doSwap(ListNode? head) {
// 不成对,直接返回
if (head == null || head.next == null) return head;
//开始交换
ListNode? newhead = head.next;
ListNode? nextPairHead = newhead?.next;
newhead?.next = head;
// 尾部指向下一对的 head
head.next = doSwap(nextPairHead);
return newhead;
}
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/swap-nodes-in-pairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。