今天来分享的题目是Leetcode上的24题,首先我们来看下题目描述。
这里我们注意题目的要求是交换的是两个节点,而并非是交换节点中的值。
我们的解题思路如下:
首先是定义一个虚拟头结点vir
,这样方便我们操作第一个头结点,虚拟头结点vir.next
指向的是头节点,起初头结点是指向的节点1,那么我们想要做的是让vir指向节点2,然后让节点2指向节点1,让节点1指向节点3,这样就完成了节点1和节点2的交换。
那么具体的实现代码如下:
public ListNode swapPairs(ListNode head) {
ListNode vir=new ListNode();
//定义虚拟头结点
vir.next=head;
ListNode cur =vir;
while (cur.next!=null&&cur.next.next!=null){
//定义临时变量存放cur.next和cur.next.next
ListNode tem=cur.next;
ListNode tem1=cur.next.next.next;
//交换第一和第二个节点
cur.next=cur.next.next;
cur.next.next=tem;
//让节点1的.next指向节点3
tem.next=tem1;
//移动cur进行下一步的交换,cur始终指向的是欲要进行操作的节点的前一个节点。
cur=cur.next.next;
}
//将vir.next返回,无论节点如何变化vir.next永远指向头结点。
return vir.next;
}
我们来结合代码进行进一步的分析,首先是我们的while
循环,while循环中的两个判断条件分别是对当链表中的节点为奇数时的怕判断条件以及当链表中的节点为偶数时的判断条件,那么为什么cur.next!=null&&cur.next.next!=null
中间的判断不是||
而是&&
呢?并且是cur.next!=null
的判断在前,cur.next.next
的判断条件在后,这是因为&&是两个条件都满足才会真,而||是一真便真,如果cur.next.next!=null
放在前面会导致程序陷入死循环。所以这个两个条件的判断前后顺序是不能变的。
需要注意的点是,在进行节点交换之前,需要对节点的位置用临时变量进行存储,例如上图中的,我们需要先将节点1和节点3
进行存储后,方便后续的交换。
那么本期的算法题目思路以及代码的分享就到这里结束了,如果觉得博主写的对你有帮助,创作不易,希望帮博主点一个小爱心???谢谢!(●ˇ?ˇ●)