LeetCode-- Swap Nodes in Pairs

题意:

Given a linked list, swap every two adjacent nodes and return its head.

For example,
Given 1->2->3->4, you should return the list as 2->1->4->3.

Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.

大意:交换相邻两个节点的位置。

 

public class SwapNodes {
    private class ListNode {
        int val;
        ListNode next;
        ListNode(int x) {
            val = x;
        }
    }                                                      //创建内部类


    public ListNode swapPairs(ListNode head) {
        if (head == null )
            return null;                               //要注意:这里交换两个节点,其实涉及到三个节点------p , q  ,前驱节点 r  (因为要保证r的指针指向正确,可以有多个next指针指向一个节点,但不能没有指向!)
        ListNode r = new ListNode(0);       //创建一个新的节点,暂称为虚节点r;       让这个r作为head,那么这个r就是要找的前驱节点!(链表题目的常用法)
        r.next = head;                            
        head = r;
        ListNode a = head;
        ListNode p = r.next;
        ListNode q = p.next;
        ListNode tmp;                            
        while (p != null && q != null) {
            a.next = q;
            tmp = q.next;
            p.next = tmp;
            q.next = p;                            //交换时要注意的地方
            
            a = p;
            p = tmp;
            if (p != null)                             //这里要注意的是,链表中,p != null时,那么p.next是存在的,可以为null,也可以不为(因为它不是最后一个节点);  

                                                          //但是,p==null, 那么 p.next是不存在的,因为null的指针不知道指向哪里。。。(换句话说,最后一个指针的节点指针next一定为null)
                q = p.next;
        }
        return head.next;
    }
}

 

链表题目注意:

1、分析,整个过程要涉及到几个节点,前驱怎么办(增加虚节点,将head前移一位),后继怎么办(注意节点next指针,不要报空指针异常);

2、节点多,可以设置tmp,不用多用p.next.next.next这类,太麻烦;

3、节点的next指针问题,每个指针都有它应该指的方向!(牢记)

4、好记性不如烂笔头,在草稿纸上画一画。

转载于:https://www.cnblogs.com/neversayno/p/5122485.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值