剑指offer 反转链表

题目描述

输入一个链表,反转链表后,输出新链表的表头。

题目分析

该题目有两种解题思路,递归方式与非递归方式,直接给出代码,在代码中给出重要问题及其解释

java代码(非递归)

static class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
    }
    public ListNode ReverseList(ListNode head) {
        // 翻转链表有一个关键,就是要使用三个指针来防止链表断裂
        // 1. 当前指针pNode,用来遍历链表
        // 2. pNode的前一指针 pPre,用来记录pNode.next = pPre
        // 3. pNode的后指针 pNext,用来给调整指向的pNode赋值,pNode = pNext
        // 另一个关键点就是,到达那个节点为翻转链表的链表头结点,显然党pNext=null 时,Pnode为链表头节点
        ListNode ReverseListHead = null;
        ListNode pNode = head;
        ListNode pPre = null;
        while(pNode!=null){
            ListNode pNext = pNode.next;
            if(pNext == null){
                ReverseListHead = pNode;
            }
            // 先修改pNode.next的指向,在更改pPre的值
            pNode.next = pPre;
            pPre = pNode;
            pNode = pNext;
        }
        return ReverseListHead;
    }
    public void Print(ListNode head){
        ListNode p = head;
        while(p!=null){
            System.out.print(p.val + "--->");
            p = p.next;
        }
        System.out.println("null");
    }

    public static void main(String[] args) {
        int num = 5;
        ListNode[] a = new ListNode[num];
        for(int i = 0;i<num;i++){
            a[i] = new ListNode(i);
//            a[i].next = a[i+1];
        }
        for(int i = 0;i<num-1;i++){
            a[i].next = a[i+1];
        }
//        a[num-1].val = num-1;
        a[num-1].next = null;

        NK5_reverseList nk = new NK5_reverseList();
        nk.Print(a[0]);
        nk.Print(nk.ReverseList(a[0]));
    }

java代码(递归)

static class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
    }
    // 使用递归来解决这个问题
    ListNode ReverseList(ListNode head) {
        //如果链表为空或者链表中只有一个元素
        if(head == null||head.next==null){
            return head;
        }

        //先反转后面的链表,走到链表的末端结点
        ListNode pReverseNode=ReverseList(head.next);

        //再将当前节点设置为后面节点的后续节点
        ListNode T = head.next; //将head.next后面的链表看为一个整体,修改指向
        T.next=head; // 翻转链表
        head.next=null;

        return pReverseNode;
    }
    public void Print(ListNode head){
        ListNode p = head;
        while(p!=null){
            System.out.print(p.val + "--.");
            p = p.next;
        }
        System.out.println("null");
    }

    public static void main(String[] args) {
        int num = 5;
        ListNode[] a = new ListNode[num];
        for(int i = 0;i<num;i++){
            a[i] = new ListNode(i);
//            a[i].next = a[i+1];
        }
        for(int i = 0;i<num-1;i++){
            a[i].next = a[i+1];
        }
//        a[num-1].val = num-1;
        a[num-1].next = null;

        NK5_reverseList2 nk = new NK5_reverseList2();
        nk.Print(a[0]);
        nk.Print(nk.ReverseList(a[0]));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值