24.两两交换链表中的节点
使用迭代的方法
创建一个头节点,避免链表的头节点丢失
/**
* 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) {
ListNode dummy = new ListNode(0,head);
ListNode tmp = dummy;
while(tmp.next!=null && tmp.next.next !=null){
ListNode pre = tmp.next;
ListNode cur = pre.next;
tmp.next = cur;
pre.next = cur.next;
cur.next = pre;
tmp = pre;
}
return dummy.next;
}
}
使用递归:
可以通过递归的方式实现两两交换链表中的节点。
递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。
如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。
用 head 表示原始链表的头节点,新的链表的第二个节点,用 newHead 表示新的链表的头节点,原始链表的第二个节点,则原始链表中的其余节点的头节点是 newHead.next。令 head.next = swapPairs(newHead.next),表示将其余节点进行两两交换,交换后的新的头节点为 head 的下一个节点。然后令 newHead.next = head,即完成了所有节点的交换。最后返回新的链表的头节点 newHead。
/**
* 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 || head.next == null) return head;
// swapPairs(ListNode head) 的意义就是两两翻转链表中的节点+返回翻转后的新的头结点
// 我们知道翻转后新的头结点必然是第二个节点
// 举例子:1->2->3->4 翻转后:2->1->4->3
ListNode newHead = head.next; // 2
// 此时tmpHead为:4->3
ListNode tmpHead = swapPairs(newHead.next);
// 而前面的还粘连着:1->2->(3) 4->3
// 此时再让1->4 此时链表为:2->(3) 1->4->3
head.next = tmpHead;
// 再将2指向1即可 此时链表为:2->1->4->3 已经完成翻转
newHead.next = head;
// 返回新的头结点
return newHead;
}
}