当前位置:   article > 正文

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

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改

力扣原题:两两交换链表中的节点

思路解析:在此题目中要求只能交换节点,不能交换节点内部的值,说明需要对各个节点的next域的指向进行更改;假设此时有四个节点,需要将1、2节点交换,3、4节点交换,即是将1节点的前驱节点指向2节点,2节点指向1节点,1节点再指向3节点(2节点的后继节点)。

但是,在做题过程中任然需要考虑特殊情况:链表中是奇数节点或者只有一个节点甚至没有节点的情况。于是得出以下代码:

  1. public class Solution24 {
  2. public ListNode swapPairs(ListNode head) {
  3. if (head == null){
  4. return null;
  5. }else if (head.next == null){
  6. return head;
  7. }
  8. ListNode newhead = new ListNode(-1);
  9. newhead.next = head;
  10. ListNode ret = newhead;
  11. ListNode cur = head.next;
  12. while (head != null && head.next != null){
  13. ret.next = cur;
  14. head.next = cur.next;
  15. cur.next = head;
  16. ret = head;
  17. head = head.next;
  18. if (head != null) {
  19. cur = head.next;
  20. }
  21. }
  22. return newhead.next;
  23. }
  24. }

在上述代码中将一个节点、无节点的情况分开来讨论,虽然最后结果是正确的,但是未免过于冗余,于是便得出一下简化代码:

  1. class Solution {
  2. public ListNode swapPairs(ListNode head) {
  3. ListNode newHead = new ListNode(-1);
  4. newHead.next = head;
  5. ListNode tmp = newHead;
  6. while (tmp.next != null && tmp.next.next != null) {
  7. ListNode node1 = tmp.next;
  8. ListNode node2 = tmp.next.next;
  9. temp.next = node2;
  10. node1.next = node2.next;
  11. node2.next = node1;
  12. temp = node1;
  13. }
  14. return newHead.next;
  15. }
  16. }

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

闽ICP备14008679号