刷题9:反转链表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题9:反转链表相关的知识,希望对你有一定的参考价值。

206. 反转链表

有三种解法:利用栈的特性来解,头插法和双指针法

1.利用栈

利用栈后入先出的特性,先把链表的元素全部压入栈中,然后出栈,把每一个出栈的元素插在链表尾部,即可完成反转,可以利用虚拟头节点来辅助,指针temp始终指向链表尾部节点,便于尾部插入元素。注意:在尾部插入最后一个元素时,一定记得在尾部加上null,不然最后元素的next指向倒数第二个元素,出现循环链表。

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null) return null;
        ListNode pre = new ListNode(-1),temp = pre;
        Stack<ListNode> st = new Stack<>();

        while(head != null){
            st.push(head);
            head = head.next;
        }

        while(!st.isEmpty()){
            temp.next = st.pop();
            temp = temp.next;
        }
         temp.next = null;

        return pre.next;
    }
}

2.头插法

如果head为空或者只有一个节点,则返回head即可。
设置一个虚拟头节点pre,然后将链表从头到尾遍历,每遍历一个元素,将该元素插入在pre和第一个元素之间,需要注意的是,在遍历过程中要用中间变量temp来保存当前元素的下一个节点,以防丢失。

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = new ListNode(-1);

        while(head != null){
            ListNode temp = head.next;
            head.next = pre.next;
            pre.next = head;
            head = temp;
        }

        return pre.next;
    }
}

3.双指针法

关键:first首先设置为null,用于作为链表反转后的空节点,second指针首先指向head,随后second.next = first,接着first和second指针每次往后移动一个节点,每次都second.next = first,直到seocnd=null,返回first作为反转链表的头节点。

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null) return head;

        ListNode first = null,second = head;

        while(second != null){
            ListNode temp = second.next;
            second.next = first;
            first = second;
            second = temp;
        }

        return first;
    }
}

以上是关于刷题9:反转链表的主要内容,如果未能解决你的问题,请参考以下文章

刷题-力扣-反转链表

LeetCode刷题--点滴记录009

剑指offer系列刷题第二篇——从尾到头打印链表和反转链表

[JavaScript 刷题] 链表 - 反转链表, leetcode 206

[JavaScript 刷题] 链表 - 反转链表, leetcode 206

Leetcode刷题100天—206. 反转链表(链表)—day01