继续打卡算法题,今天学习的是LeetCode的第24题两两交换链表中的节点,这道题目是道中等题
。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些帮助。
分析一波题目
这道题目很容易理解,容易读懂题意,我们只要掌握诀窍,通过前驱节点指向后续两个需要交换的节点,不断移动前驱节点,只要前驱节点的后面两个节点都存在,就执行交换,并移动前驱节点。
我们可以构造一个虚节点,指向头节点。第一次前驱节点等于虚拟节点
编码实现
/**
* 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) {
if(head == null || head.next == null) {
return head;
}
//虚拟节点
ListNode dumy = new ListNode();
dumy.next = head;
ListNode pre = dumy;
while(pre.next != null && pre.next.next != null ) {
//获取两个待交换位置的两个节点
ListNode node1 = pre.next;
ListNode node2 = pre.next.next;
node1.next = node2.next;
node2.next = node1;
// 头节点替换 这里是关键,这里要想通,前驱节点每次都必须更新 pre前面的节点和新的后继节点关联上。
pre.next = node2;
pre = node1;
}
return dumy.next;
}
}
总结
题意容易理解的题目,我们主要是注意细节,这道题目,交换链表节点需要考虑几个点:
1、两个节点交换,交换之后两个节点后续的节点已经天然关联上了。
2、第一个节点前的节点,需要和交换后的后继节点关联上