24.成对交换链表节点
24. Swap Nodes in Pairs
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.
迭代法
本题的解题思路很简单。我们首先提取为list添加一个头结点。然后我设置三个指针,pre,cur,post。cur和post是需要两两交换的指针。令pre.next = post,然后post.next = cur。这样子就达到了交换的目的,交换后继续更新三个指针的位置。直到最后面得出结果。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || null == head.next){
return head;
}
ListNode first = new ListNode(0);
first.next = head;
ListNode pre = first;
ListNode cur = head;
ListNode post = cur.next;
while(cur != null && post != cur){
ListNode newNode = post.next;
pre.next = post;
post.next = cur;
cur.next = newNode;
pre = cur;
cur = pre.next;
if(cur == null){
return first.next;
} else if(cur.next != null){
post = cur.next;
} else {
post = cur;
}
}
return first.next;
}
}
递归
使用递归进行操作相对于迭代而言会比较抽象一点,但是也不是很难理解。其核心思想是和迭代的一样的。每次两对两对的更新。只不过递归是从后往前交换,而迭代时从前往后交换。
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode nextnextSwapped = swapPairs(head.next.next);
ListNode newHead = head.next;
newHead.next = head;
head.next = nextnextSwapped;
return newHead;
}
}