反转链表的实现

题目:反转链表

注:一千个人心理有一千个哈姆雷特。哪怕思路一致,1000个人可能写出的代码都会有1000种形式,在此我只是分享下思路,至于代码实现,各位看客参考即可,如果有更好的思路,欢迎在评论区指出~~~感谢各位~

问题描述:

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

输入:

{1,2,3}

返回值:

{3,2,1}

问题分析:

​ 遇到反转链表的问题,我们一般使用遍历反转即可解决此类问题。例如,如果给定元素是{1,2,3},我们进行遍历的时候,记两个值,一个是pre(前一个值),一个是cur(遍历当前位置的值)。在操作前,指针指向是pre->cur,我们在操作后,会变成cur->pre。也就是说我们会把{1->2->3}操作后变成{1<-2<-3}。

在这里插入图片描述

​ 所以,我们只要每次都能确保获取到准确的pre和cur值,就可以完成这个过程。

​ 1)遍历到1的时候,我们不操作。因为cur=1,但是pre 是不存在,因为1是最前面的。此时我们手动赋值,pre =1。赋值之后,为了避免元素1的next影响我们后续指针变化,所以这里要执行pre.next = null

在这里插入图片描述

在这里插入图片描述

​ 2)遍历到2的时候,pre =1,cur = 2 ;首先要保留2的下一个,否则在cur.next = pre之后,我们就无法遍历到元素3了。temp= cur.next ; cur.next = pre; pre = cur; cur = temp;我们一步一步来:

在这里插入图片描述
在这里插入图片描述

​ 3)继续循环遍历,进行该操作。直到遍历到最后一个节点,也就是ele == null的时候。

​ 4)最后我们返回最后一个节点,也就是pre节点。因为cur此时是最后一个不存在的节点,是null值(由代码可得)

代码实现:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    
    
    public ListNode ReverseList(ListNode head) {
    
    
        if(head==null || head.next==null){
    
    
            return head;
        }

        ListNode temp = null;
        ListNode pre = null;
        ListNode cur = head;
        while(cur!=null){
    
    
            if(pre==null){
    
    
                pre = cur;
                cur = cur.next;
                pre.next = null;
            }else{
    
    
                temp = cur.next;
                cur.next = pre;
                pre = cur;
                cur = temp;
            }
        }
        return pre;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41998764/article/details/117457461