leetcode 94.二叉树的中序遍历

思路:我们可以定义三个指针进行操作。

首先分析一下为什么会用三个指针。我们知道,在链表中交换结点,我们需要更改结点的指针地址,在两个相邻结点的交换当中,我们需要知道这两个结点。举个例子:

比如1,2这两个相邻的结点,在自然数中,2的后面肯定是3,用链表形式表示,也就有了1->2->3

我们的目的是要交换1和2的位置,我们首先就需要知道2后面的指向3,这样我们才能把1的指针指向2后面的数,接着就需要用2指向1,这样就完成了一次交换。

但是,如果有多个数呢?比如1,2,3,4,5这个时候我们只对于两个结点的指针地址修改是不够的,当我们交换3,4这两个结点的时候,我们就必须要处理2这个数到底指向谁,所以,为了迭代一致,我们需要用3个指针进行操作。

回到第一个例子里,1->2->3,交换1,2,怎么用三个指针操作呢?很简单,我们只需要在1前面加上一个表头就行了,假设表头的元素值为-1,那么:-1->1->2->3,这样就解决了在头节点位置进行交换结点的问题了,之后汇总一下,就出来结果了。

注意:必须定义指向表头的指针,这样在交换节点之后,我们才能从表头再重新遍历这个链表,否则表头的指向发生了变化就不会指向链表的最前端了。

在代码中,为什么tmp只是向前移动了一次呢?而不是两次呢?因为我们的tmp在经过交换操作之后,已经移动了一次(tmp是两个结点的第一个结点,是前者;交换完之后变成了后者),所以我们只需要移动一次就够了。

/**
 * 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)
        return null;
        ListNode dummy=new ListNode(-1);
        dummy.next=head;
        ListNode tmp=head;
        ListNode tou=dummy;
        while(tmp!=null&&tmp.next!=null){
            ListNode p=tmp.next;
            tou.next=p;
            tmp.next=p.next;
            p.next=tmp;
            tmp=tmp.next;
            tou=tou.next.next;
        }
        return dummy.next;
        
        
        
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值