Leetcode T24 :两两交换链表中的节点

Leetcode T24 :两两交换链表中的节点,这样的思路为什么会出错?

/**
 * 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)
            return null;
        ListNode pre = head;
        ListNode cur = head.next;
        ListNode save;
        while(pre != null && cur != null) {
            save = cur.next;
            cur = pre;
            pre = save;
            if(save == null || save.next == null)
                break;
            pre = save;
            cur = save.next;
        }
        return head;
    }
}

img

怎么个两两交换法?相邻两个交换?
save = cur.next;
cur = pre;
pre = save;
这样交换显然没用,因为链表关系重点在于next的指向,指向没变,你这交换就没有作用
save = cur.next;
cur.next = pre;
pre.next = save;
如果你这head是个有值的头结点,那你还需要特殊判断一下。当第一次交换时,要将head = cur加到交换之前