链表虚拟头结点的设置 LeetCode_24

LeetCode_24 两两交换链表中的节点 因为头结点会发生变化,返回时找到头结点是关键。这就可以引入虚拟头结点: 设置 Node dummyNode 指向当前头结点,再令一个preNode = dummyNode。

public ListNode swapPairs(ListNode head) {
          
   
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pre = dummy;
        while(pre.next != null && pre.next.next != null){
          
   
            ListNode temp = head.next.next;
            pre.next = head.next;      //由于pre与dummy指向同一个节点,此时pre.next指向最后修改后的头结点。同时dummy.next也就指向最后的头结点
            head.next.next = head;
            head.next = temp;
            pre = head;               //此时pre就与dummy无关了
            head = head.next;
        }

        return dummy.next;   //注意dummy.next 才是头结点
    }

这道题一定要画图,可以把逻辑理顺!!图源@代码随想录 关于虚拟头结点还可以看LeetCode_0203进行实践。

经验分享 程序员 微信小程序 职场和发展