前言反转链表是程序员必须具备的基本素质,在面试和笔试中经常出现。一直觉得反向链表的实现代码不太好理解,所以决定拿leetcode经典的反向链表题,用十多张图来分析一下,希望能加深大家对linked的理解倒序排列,感谢阅读。Leetcode的反向链表原题&答案题目描述:反转一个单向链表。输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL分析:假设有一个链表1→2→3→?,我们想把它改成?←1←2←3。在遍历链表的时候,把当前节点的next指针改成指向上一个元素。由于节点没有对其前一个节点的引用,因此必须预先存储其前一个元素。在更改引用之前需要另一个指针来存储下一个节点。不要忘记在最后返回新的head引用!代码实现:publicListNodereverseList(ListNodehead){ListNodeprev=null;ListNodecurr=head;while(curr!=null){ListNodeextTemp=curr.next;curr.next=prev;prev=curr;curr=nextTemp;}returnprev;}说明链表反转代码的实现接下来我们说明上面代码的实现,首先在上面的实现代码中加上行号,如下:publicListNodereverseList(ListNodehead){//1ListNodeprev=null;//2ListNodecurr=head;//3while(curr!=null){//4ListNodeextTemp=curr.next;//5curr.next=prev;//6prev=curr;//7curr=nextTemp;//8}returnprev;//9}代码图第一行publicListNodereverseList(ListNodehead){//1顺着标题描述一下意思,假设链表有1、2、3个元素,后面跟着一个null,因为input是ListNode头,这个即将是反向链表如下:代码图第二行ListNodeprev=null;//2将null赋值给prev,即prev指向null,示意图如下代码示意图第三行ListNodecurr=head;将链表的头部赋值给curr,即curr指向头部链表,可以得到下图:循环的代码图while(curr!=null){//4ListNodenextTemp=curr.next;//5curr.next=prev;//6prev=curr;//7curr=nextTemp;//8}循环部分是链表反转的核心部分。让我们先遍历循环并以图形方式对其进行分析。因为curr指向head,而head不为null,所以进入了循环。先看第5行:ListNodenextTemp=curr.next;//5将curr.next赋值给nextTemp变量,即nextTemp指向curr的下一个节点(即节点2),如图:然后执行到第6行:curr.next=prev;//6将prev赋值给curr.next,因为prev初始化指向null,即curr(节点1)指向null,链表图为像这样:然后我们看到执行到第7行prev=curr;//7将curr赋值给prev,prev指向curr,图示如下:然后,我们执行到第8行:curr=nextTemp;//8赋值nextTemptocurr,即curr指向nextTemp,说明如下:至此,第一个循环执行完毕,回到循环条件,curr仍不为null,我们继续说明。再次执行5-8行代码,依次获取图片:ListNodeextTemp=curr.next;//5curr.next=prev;//6prev=curr;//7curr=nextTemp;//8ListNodeextTemp=curr.next执行后;之后:执行curr.next=prev;之后:执行prev=curr;之后:执行curr=nextTemp;之后:来到这里,发现curr还是不为null,回到while循环,再次执行:ListNodeextTemp=curr.next;//5curr.next=prev;//6prev=curr;//7curr=nextTemp;//8为了得到图片:来到这里,我们发现curr为null,我们可以跳出循环。此时prev指向链表的反转,所以第9行执行后,实现了反转链表的功能:returnprev;//9
