链表的反转

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节点。流程如下;

  1. 初始化preNode和curNode指向head节点。
  2. 先将curNode移动一次,使preNode在前,curNode在后。
  3. 然后开始循环遍历,先保存curNode的next,tempNode = curNode.next。然后将curNode.next = preNode,然后移动curNode和preNode分别向后移动一次,其中preNode = curNode,curNode = temp;因为temp保存了旧curNode.next,而新的curNode.next已经指向前面了。
  4. 当preNoe为null结束循环,返回curNode即可。

2.2新建链表法

  虽然是单链表的反转操作,我们可以通过将curNode节点,加载新的链表的第二个位置来实现反转;具体来说,就是依次取出原链表的节点,放在新的链表第二个位置,然后当链表遍历完成后,就形成了一个反向链表了。流程如下;

  1. 创建一个新的head节点,newHead用当作新链表的头部。
  2. 取出原链表的节点为curNode,暂存其next,tempNode = curNode.next。然后curNode指向newHead的next,即curNode.next = newHead.next,这样子就会使newHead的第二个节点放在了curNode节点的后面,然后newHead的next指向curNode,使curNode一直处于newHead的第二个节点位置。
  3. 然后,curNode = temp。
  4. 重复2-3,直到curNode == null 
  5. 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;
    }
}

 

posted @ 2020-03-14 10:15  大朱123  阅读(262)  评论(0编辑  收藏  举报