剑指offer:输入一个链表,反转链表后,输出新链表的表头。

剑指offer算法题


链表

题目描述
输入一个链表,反转链表后,输出新链表的表头。

题目分析
反转链表的本质是让本来当前节点应该指向下一个节点,反转后的当前节点则是指向前一个节点。所以我们需要两个临时变量来存储当前节点以及下一个节点,我们称当前节点为cur1,下一个节点为cur2。首先,用tmp来存储当前节点的current.next,也就是cur2;然后另当前节点的current.next指向前一个节点,也就是用pre存储的当前节点。因为第一次循环的pre为null,所以current.next为null。然后另pre=current,也就是用pre来存储当前节点cur1。然后再另current = tmp 也就是当前节点变为下一个节点cur2。这样操作之后,对于cur1来说,作为反转后的尾节点,他的cur1.next为null。现在这个节点的内容是,cur2,他的指针指向pre,第一次循环中pre没有值,也就是null。下一次循环,tmp = current.next ,也就是cur3的地址。然后,current.next = pre,就是另当前,cur2.next指向cur1,完成了cur2的指针指向cur1,至此,第二个节点的反转完成。

总结来说循环体中的操作是,将当前节点指针指向前一个节点,之后另当前节点为下一个节点,往复循环。

下面是JAVA算法实现:

    public ListNode ReverseList(ListNode head) {
        if(head == null){
            return null;
        }
        
        ListNode reversedHead = null ;//不用这个变量,最后直接输出pre节点也可以。循环结束后的pre节点即是反转链表后的新的表头。
        ListNode current = head;
        ListNode tmp = null;
        ListNode pre = null;
        
        while(current !=null){
            tmp = current.next;
            current.next = pre ;
            if(tmp ==null){
            //当current.next为null的时候,也就意味着到了原链表的最后一个节点。这个节点就是反转链表后新链表的头节点。
                reversedHead = current;
            }
            pre = current;
            current = tmp;
        }       
        return reversedHead;
    }

参考https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&&tqId=11168&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值