给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
正解
1)第一种方法:交换链表节点的元素
/**
* 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; }
* }
*/
public ListNode swapPairs(ListNode head) {
ListNode tep = head;
int size = 0;
if (head != null) {
size++;
while (tep.next != null) {
tep = tep.next;
size++;
}
ListNode first = head;
ListNode second = null;
int val1 = first.val;
int val2 = 0;
if (size >= 2) {
second = first.next;
val2 = second.val;
second.val = val1;
first.val = val2;
size -= 2;
} else {
return head;
}
while (size >= 2) {
first = first.next.next;
second = second.next.next;
val1 = first.val;
val2 = second.val;
second.val = val1;
first.val = val2;
size -= 2;
}
}
return head;
}
2)第二种方法:改变链表节点的指针
初始时,cur指向虚拟头结点,然后进行如下三步:
操作之后,链表如下:
看这个可能就更直观一些了:
public ListNode swapPairs(ListNode head) {
//创建虚拟头节点
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode cur = dummyHead;
ListNode temp1 = null;
ListNode temp2 = null;
while (cur.next != null && cur.next.next != null) {
//记录节点
temp1 = cur.next;
temp2 = cur.next.next.next;
cur.next = cur.next.next;//步骤1
cur.next.next = temp1;//步骤2
cur.next.next.next = temp2;//步骤3
cur = cur.next.next;//当前节点往后移动两位
}
return dummyHead.next;
}