链表的反转
Posted dazhu123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表的反转相关的知识,希望对你有一定的参考价值。
1:题目描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2:解题思路
2.1双指针法
由于单向链表只能再单一方向上操作,且要进行增删改要辅助指针,所以我们这里可以通过增肌两个指针pre和cur,分别指向当前节点和当前节点的前一个节点,然后通过将当前节点的next指向pre,然后遍历即可,其中要再curNode.next指向preNode之前,暂存curNode的next节点。流程如下;
- 初始化preNode和curNode指向head节点。
- 先将curNode移动一次,使preNode在前,curNode在后。
- 然后开始循环遍历,先保存curNode的next,tempNode = curNode.next。然后将curNode.next = preNode,然后移动curNode和preNode分别向后移动一次,其中preNode = curNode,curNode = temp;因为temp保存了旧curNode.next,而新的curNode.next已经指向前面了。
- 当preNoe为null结束循环,返回curNode即可。
2.2新建链表法
虽然是单链表的反转操作,我们可以通过将curNode节点,加载新的链表的第二个位置来实现反转;具体来说,就是依次取出原链表的节点,放在新的链表第二个位置,然后当链表遍历完成后,就形成了一个反向链表了。流程如下;
- 创建一个新的head节点,newHead用当作新链表的头部。
- 取出原链表的节点为curNode,暂存其next,tempNode = curNode.next。然后curNode指向newHead的next,即curNode.next = newHead.next,这样子就会使newHead的第二个节点放在了curNode节点的后面,然后newHead的next指向curNode,使curNode一直处于newHead的第二个节点位置。
- 然后,curNode = temp。
- 重复2-3,直到curNode == null
- return newHead.next即为新的链表。
3:代码示例
3.1:双指针法
public ListNode reverseList2(ListNode head){ //创建两个指针一前一后 ListNode preNode = head; ListNode curNode = head.next; ListNode temp = null; //循环判断 while(true){ if(curNode == null){ break; } //保存curNode.next以供后面使用 temp = curNode.next; //curNode指向前面preNode curNode.next = preNode; //preNode和curNode后移 preNode = curNode; curNode =temp; } return preNode; }
3.2:新建链表法
class Solution { public ListNode reverseList(ListNode head) { ListNode newHead = new ListNode(0); ListNode curNode = head; ListNode temp = null; while(true){ if(curNode == null){ break; } //暂存curNode.next,供后面的后移使用, //因为下面要对curNode.next操作 temp = curNode.next; //让当前的节点直接newHead的next,相当于把newHead节点后面的接在了curNode后面, curNode.next = newHead.next; //然后再将curNode接在newHead后面即可 newHead.next = curNode; curNode = temp; } return newHead.next; } }
以上是关于链表的反转的主要内容,如果未能解决你的问题,请参考以下文章