0024. Swap Nodes in Pairs (M)
Swap Nodes in Pairs (M)
题目
Given a linked list, swap every two adjacent nodes and return its head.
You may not modify the values in the list's nodes, only nodes itself may be changed.
Example:
Given 1->2->3->4, you should return the list as 2->1->4->3.
题意
按顺序将给定的链表中的元素两两交换,但不能更改结点中的值,只能对结点本身进行操作。
思路
问题中包含链表和子结点等概念,且结点需要变动,很容易想到利用递归来解决,直接上代码。
或者直接将结点拆下放到新链表中更简单。
代码实现
Java
class Solution {
public ListNode swapPairs(ListNode head) {
// 递归边界,当待交换结点数不足2时直接返回
if (head == null || head.next == null) {
return head;
}
ListNode first = head;
ListNode second = first.next;
first.next = swapPairs(second.next);
second.next = first;
return second;
}
}
JavaScript
新链表
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var swapPairs = function (head) {
let dummy = new ListNode()
let cur = dummy
while (head !== null) {
let a = head, b = head.next
if (b !== null) {
head = b.next
b.next = a
a.next = null
cur.next = b
cur = a
} else {
cur.next = a
head = null
}
}
return dummy.next
}
递归
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var swapPairs = function (head) {
if (head === null) {
return null
}
if (head.next !== null) {
let nextHead = swapPairs(head.next.next)
head.next.next = head
head = head.next
head.next.next = nextHead
}
return head
}