1.题目描述:
2.1解决方法:
图一:
根据题目内容可知:我们需要在链表中两两调换节点的位置,因此我们需要定义一个虚拟节点指向头结点(即链表的第一个节点),并且定义一个当前指针指向虚拟头结点,从而便于获取头结点的位置
图二:
如上图二所示,从头结点开始两两交换节点之间的位置,但是交换之前,我们需要定义一个临时节点temp先将头结点1的位置进行保存,然后当前指针指向节点2,节点2的指针指向节点1(即temp),如果没有保存的话,那么当虚拟头结点的指针指向节点2时,我们就找不到节点1的位置了
当链表中节点个数为奇数时:
例如图二:如果3,4节点完成位置交换后,当前指针就位于3位置,因此我们只需要判断当前指针所处位置下的节点的下下一个节点是否为空即可,即判断3节点的下下一个节点是否为空,如图可知:3节点的下一个节点为5节点,5节点后面为空,所有不再交换
图三:
当链表中节点个数为偶数时:
刚好两两交换完全,我们只需要判断当前节点的下下一个节点是否为空即可
例如图三:如果5,6节点完成交换后,当前指针就位于5位置,我们指向要判断节点5后面的是不是空就可以了,如图可知:5节点后为空,所有不再交换
2.2完整代码:
/**
* 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 dummyhead = new ListNode(-1,head); // 设置一个虚拟头结点并指向头结点
ListNode cur = dummyhead;
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 dummyhead.next;
}
}
3.小节:
著此篇,与君享,互勉之,共进步!