• LeetCode24.两两交换链表中的节点


     这道题还是比较简单,我看完题目的想法就是借助一个第三变量,来改变两个节点的指针的指向,比如我要改变1和2节点的指向,我用h1表示节点1,我创建一个新的节点ans,先拿ans指向节点2(ans.next = h1.next),然后再拿节点1指向节点3(h1.next = h1.next.next),然后再拿节点2指向节点1(ans.next.next = h1),现在的情况就是ans --> 2 -->1(h1) -->3,接下来要交换节点3和节点4,我把h1移到3的位置(h1=h1.next)和ans移到h1的前面一个位置(ans=ans.next.next),现在的情况就是 -->2--->1(ans) -->3(h1) -->4,接下来就可以像交换1和2一样交换3和4了。但是移动h1和ans之前我们先做判断如果3的位置是null或者4的位置是null就不用再交换了直接返回答案即可,答案就是我们创建的ans的下一个节点,所以再创建ans的同时我就用一个result变量储存ans的地址,最后返回resutl->next即可,一下是我的代码:

    1. class Solution {
    2. public ListNode swapPairs(ListNode head) {
    3. ListNode h1 = head;
    4. if(h1 == null || h1.next == null)return h1;
    5. ListNode ans = new ListNode();
    6. ListNode result = ans;
    7. while(h1 != null && h1.next != null){
    8. ans.next = h1.next;
    9. h1.next = h1.next.next;
    10. ans.next.next = h1;
    11. if(h1.next != null){
    12. h1 = h1.next;
    13. }else{
    14. return result.next;
    15. }
    16. ans = ans.next.next;
    17. }
    18. return result.next;
    19. }
    20. }

    看看题解做法:

    题解的第一种做法是使用递归,用head表示原始链表的第一个节点,新链表的第二个节点,用newHead表示原始链表的第二个节点,新链表的第一个节点。原始链表的其余节点的头节点是newHead.next,令head.next=swapPairs(newHead.next),表示将其余节点进行两两交换,交换后的头节点是head的下一个节点,然后令newHead.next=head,即完成了所有节点的交换,最后返回新链表的头节点newHead,

    1. class Solution {
    2. public ListNode swapPairs(ListNode head) {
    3. if (head == null || head.next == null) {
    4. return head;
    5. }
    6. ListNode newHead = head.next;
    7. head.next = swapPairs(newHead.next);
    8. newHead.next = head;
    9. return newHead;
    10. }
    11. }

    第二种方法就和我的解法一样他管这个ans节点叫做哑节点。

  • 相关阅读:
    第三届阿里云磐久智维算法大赛——GRU BaseLine
    经典算法——直接选择排序
    新装机电脑网速特别慢
    解析虚拟文件系统的调用
    PTA初级题目练习
    强化学习之REINFORECE策略梯度算法——已CartPole环境为例
    MTK 关机充电时充电IC正常,电池正常充电,但是充电动画一直显示0%
    elementUI el-table+树形结构子节点选中后没有打勾?(element版本问题 已解决)
    MST1172TS-A,摩托车,电动自行车闪光器芯片
    自动化测试之路 —— Appium使用教程
  • 原文地址:https://blog.csdn.net/qq_61009660/article/details/133868875