1. 虚拟头节点
在反转列表一文中就有用到虚拟头节点(reverseHead),只不过是在定义链表的时候直接用的,目的就是用一个不含任何有效数据的head来方便我们对链表进行操作。唯一需要注意的是最后return的是虚拟头节点的下一个节点。
2.两两交换链表中的节点
题目:https://leetcode-cn.com/problems/swap-nodes-in-pairs/
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解法-画图
按照1,2,3步完成代码(2和3中的标号是一个循环里对应的步骤)
/**
* 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 virtual = new ListNode(0);
virtual.next = head;
ListNode pre = virtual;
//开始循环
while(pre.next!=null && pre.next.next!=null){
//设置temp临时变量来保存下一个待使用的
ListNode temp = head.next.next;
pre.next = head.next;
head.next.next = head;
head.next = temp;
pre = head;
head = head.next;
}
//返回不能动的虚拟头节点,记得要返回他的下一个节点,因为它是你设置的
return virtual.next;
}
}