两两交换链表中的节点
在本题中,我们需要注意,要交换的是链表的节点,而不是链表节点的值,所以我们需要对链表的节点进行操作,改变指针来达到移动节点的操作。
首先我们需要一个虚拟头节点,以此来保障不需要额外关注头节点。之后,我们想要交换虚拟头节点后一个和后后一个节点,那我们让虚拟头节点的指针直接指向它后后节点,但是,这时候我们会发现,我们再想指回头节点回不去了,所以需要指针来提前保存。
注意,我们要两两交换节点,那么我们只需要把cur指针移动到要交换的第一个节点之前就好!
通过cur.next和cur.next.next来进行操作。
个人理解在做链表类题目中,初始化的时候,左边是没有next的,而移动的时候,左边是右next的
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dumyhead = new ListNode(-1); // 设置一个虚拟头结点
dumyhead.next = head; // 将虚拟头结点指向head,这样方便后面做删除操作
ListNode cur = dumyhead;
ListNode temp; // 临时节点,保存两个节点后面的节点
ListNode firstnode; // 临时节点,保存两个节点之中的第一个节点
ListNode secondnode; // 临时节点,保存两个节点之中的第二个节点
while (cur.next != null && cur.next.next != null) {
temp = cur.next.next.next;
firstnode = cur.next;
secondnode = cur.next.next;
cur.next = secondnode; // 步骤一
secondnode.next = firstnode; // 步骤二
firstnode.next = temp; // 步骤三
cur = firstnode; // cur移动,准备下一轮交换
}
return dumyhead.next;
}
}
来源:方法来源