资讯专栏INFORMATION COLUMN

[Leetcode] Reverse Linked List 反转链表

Eminjannn / 2722人阅读

摘要:先跳过前个节点,然后初始化好这五个指针后,用中的方法反转链表。完成了第个节点的反转后,将子链反转前的头节点的设为子链反转过程中的下一个节点,将子链反转前头节点前面一个节点的设为子链反转过程中的当前节点。

Reverse Linked List I

Reverse a singly linked list.

click to show more hints.

Hint: A linked list can be reversed either iteratively or recursively. Could you implement both?

递归法 复杂度

时间 O(N) 空间 O(N) 递归栈空间

思路

基本递归

代码
public class Solution {
    
    ListNode newHead;
    
    public ListNode reverseList(ListNode head) {
        reverse(head);
        return newHead;
    }
    
    private ListNode reverse(ListNode n){
        if( n == null || n.next == null){
            newHead = n;
        } else {
            ListNode prev = reverseList(n.next);
            prev.next = n;
        }
        return n;
    }
}
迭代法 复杂度

时间 O(N) 空间 O(1)

思路

基本迭代

代码

java

public class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode p1 = head;
        ListNode p2 = p1.next;
        while(p2 != null){
            ListNode tmp = p2.next;
            p2.next = p1;
            p1 = p2;
            p2 = tmp;
        }
        head.next = null;
        return p1;
    }
}

python

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        p1 = None
        p2 = head
        while(p2 is not None):
            tmp = p2.next
            p2.next = p1
            p1 = p2
            p2 = tmp
        return p1
Reverse Linked List II

Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example: Given 1->2->3->4->5->NULL, m = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note: Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ length of list.

迭代法 复杂度

时间 O(N) 空间 O(1)

思路

技巧在于记录下这么几个变量:dummyHead、子链反转前的头节点,子链反转前头节点前面一个节点,子链反转过程中的当前节点,子链反转过程中的下一个节点,这五个指针。先跳过前m个节点,然后初始化好这五个指针后,用I中的方法反转链表。完成了第n个节点的反转后,将子链反转前的头节点的next设为子链反转过程中的下一个节点,将子链反转前头节点前面一个节点的next设为子链反转过程中的当前节点。由于设置了dummyhead,我们所有的反转操作都是不包含头节点的,所以直接返回dummyhead的next就行了。

注意

跳过前m个节点的for循环要从1开始,因为我们要保证head是第m-1个元素,如果m=1则不动。

代码
public class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        if(head == null || head.next == null) return head;
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        head = dummy;
        for(int i = 1 ; i < m; i++){
            head = head.next;
        }
        ListNode headOfSubList = head.next;
        ListNode nodeBeforeHead = head;
        ListNode nextNode = head.next.next;
        ListNode currNode = head.next;
        for(int i = m; i < n ; i++){
            ListNode tmp = nextNode.next;
            nextNode.next = currNode;
            currNode = nextNode;
            nextNode = tmp;
        }
        headOfSubList.next = nextNode;
        nodeBeforeHead.next = currNode;
        return dummy.next;
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64500.html

相关文章

  • LeetCode 206:反转链表 Reverse Linked List

    摘要:反转一个单链表。示例输入输出进阶你可以迭代或递归地反转链表。你能否用两种方法解决这道题解题思路每次遍历到最后一位取节点这种方法就算了时间复杂度太高。从链表末尾向头部逐个分离节点,并将节点添加到新链表的末尾。与迭代法原理相似。 反转一个单链表。 Reverse a singly linked list. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2...

    Gilbertat 评论0 收藏0
  • LeetCode 206:反转链表 Reverse Linked List

    摘要:反转一个单链表。示例输入输出进阶你可以迭代或递归地反转链表。你能否用两种方法解决这道题解题思路每次遍历到最后一位取节点这种方法就算了时间复杂度太高。从链表末尾向头部逐个分离节点,并将节点添加到新链表的末尾。与迭代法原理相似。 反转一个单链表。 Reverse a singly linked list. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2...

    heartFollower 评论0 收藏0
  • LeetCode 之 JavaScript 解答第206题 —— 反转链表Reverse Link

    摘要:算法思路两种方法一般反转递归法一般解决定义三个指针,分别为,存储当前结点,指向反转好的结点的头结点,存储下一结点信息。递归法重点分析先确定终止条件当下一结点为时,返回当前节点判断当前的链表是否为递归找到尾结点,将其存储为头结点。 Time:2019/4/23Title: Reverse Linked ListDifficulty: EasyAuthor: 小鹿 题目:Reverse...

    zhangfaliang 评论0 收藏0
  • [Leetcode] Reverse Linked List 链表反转(递归与非递归)

    摘要:代码描述调转指针解法非递归用三个指针,紧紧相邻,不断前进,每次将指向,将指向指向。描述递归解法测试结果 Reverse a singly linked list. 代码ReverseLinkedList.java package list; public class ReverseLinkedList { /** * 描述 Reverse a singly...

    RyanHoo 评论0 收藏0
  • [Leetcode] Swap Nodes in Pairs Reverse Nodes in k-

    摘要:三指针法复杂度时间空间思路基本的操作链表,见注释。注意使用头节点方便操作头节点。翻转后,开头节点就成了最后一个节点。 Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should ...

    TZLLOG 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<