当前位置:   article > 正文

Leetcode NO24.两两交换链表中的节点(虚拟头节点心得)_交换头节点

交换头节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

链接:https://leetcode.cn/problems/swap-nodes-in-pairs

示例 1:


输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:

输入:head = []
输出:[]
示例 3:

输入:head = [1]
输出:[1]

 

  1. public class Solution
  2. {
  3. public ListNode SwapPairs(ListNode head)
  4. {
  5. ListNode dummyNode = new ListNode(0);
  6. dummyNode.next = head;
  7. ListNode prev = dummyNode;
  8. ListNode cur = head;
  9. ListNode next = head.next;
  10. while (cur != null && next != null)
  11. {
  12. ListNode tmp = cur;
  13. prev.next = next;
  14. cur.next = next.next;
  15. next.next = cur;
  16. prev = prev.next.next;
  17. if (prev.next == null)
  18. {
  19. next = null;
  20. }
  21. else
  22. {
  23. cur = prev.next;
  24. next = cur.next;
  25. }
  26. }
  27. return dummyNode.next;
  28. }
  29. }

这道题有点思维定式了。写代码时没有仔细思考,直接使用了prev,cur,next, 结果发现报空指针异常,System.NullReferenceException: Object reference not set to an instance of an  instance of an object.因为这道题交换并不是每两个节点都要交换,而是要分成两个一组,组内交换,所以需要prev=next,即向后走两步,就会出现next在赋值时可能因为cur==null而空指针异常,所以不能想当然就用prev,cur,next,要根据实际情况来。于是经过改良写了第二种

  1. public class Solution
  2. {
  3. public ListNode SwapPairs(ListNode head)
  4. {
  5. ListNode dummyNode = new ListNode(0);
  6. dummyNode.next = head;
  7. ListNode prev = dummyNode;
  8. ListNode cur = head;
  9. //ListNode next = head.next;
  10. while (cur != null && cur.next != null)
  11. {
  12. ListNode tmp = cur.next.next;
  13. prev.next = cur.next;
  14. cur.next.next = cur;
  15. cur.next=tmp;
  16. prev = cur;
  17. cur = prev.next;
  18. //next = cur.next;
  19. }
  20. return dummyNode.next;
  21. }
  22. }

相比于第一种,只设置了两个变量,prev和cur,这样我就无需担心next赋值会导致空指针异常,在循环判断时利用“&&”在第一个条件为false时就已经终止这一原理,避免用空指针访问 。这是这道题虚拟头节点方法中比较巧妙的一点。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/信息技术墨韵书生/article/detail/61245
推荐阅读
相关标签
  

闽ICP备14008679号