题目链接
题目内容
解题分析
1、要操作一个节点A,就需要知道这个节点的地址,这个节点的地址也就是它前一个结点的指针域的值。
2、如果要进行两个节点地址的交换,和交换两个基本类型的值类似,可以构建临时变量用来存放值。
3、要操作第一个节点,可以构建一个虚拟头节点,指向第一个节点1,如果把虚拟头节点的指向从1改成2,再把2的指向从3改成1,那这样就完成了1和2两个节点的交换。
4、在交换过程中,需要先把1的地址和3的地址放到变量中保存,否则会丢失。1和3的地址分别是他们前一个节点的指向。
5、构建一个当前操作的节点,从虚拟头节点开始操作,操作完后两个节点的交换后,操作节点应该移到下下个节点,准备进行下一次操作。
6、如果当前操作节点的指向是空,说明当前位于链表的末端,停止操作;如果当前操作节点的下下个节点是空,说明当前操作节点无法进行交换的操作,也应该停止。
代码实现
/**
* 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 {
/**
分析:变更链表中某个节点的顺序,实际上是操作这个节点的前一个节点中指针域的指向
思路:先构造一个虚拟的头节点virHead,指针域内容为当前链表的第一个节点,把虚拟头节点的指针域内容换成2的,再把2的指针域内容换成1的指针,就完成了一次1和2的交换
在交换之前先用一个临时的节点保存1的指向
*/
public ListNode swapPairs(ListNode head) {
//创建虚拟头节点,指向实际头节点
ListNode virHead = new ListNode(0,head);
//当前操作的节点,从虚拟头节点开始
ListNode currentNode = virHead;
//用来临时存放指针地址
ListNode tempNode = new ListNode();
//用来临时存放指针地址
ListNode tempNode1 = new ListNode();
while(currentNode.next!=null&¤tNode.next.next!=null){
//循环条件,当前操作操作节点的下一个节点为空,说明节点总数是偶数,达到终止条件,
//如果下下个节点为空看,说明节点总数是奇数,不满足两两交换的条件,达到终止条件
//先把当前节点指向的下一个节点地址保存起来
tempNode = currentNode.next;
//把当前节点的下下个节点指向的地址保存起来
tempNode1 = currentNode.next.next.next;
//把当前节点的指向换成下下个节点的地址
currentNode.next = currentNode.next.next;
//把下个节点的指向换成保存的地址
currentNode.next.next = tempNode;
//把下下个节点的指向换成保存的地址
currentNode.next.next.next = tempNode1;
//把操作节点的地址换成当前节点的下下个节点地址
currentNode = currentNode.next.next;
}
//最后返回实际的头节点
return virHead.next;
}
}