美文网首页
翻转链表系列

翻转链表系列

作者: yxwithu | 来源:发表于2017-12-18 15:37 被阅读0次

一、 基本的翻转链表,给头结点,返回翻转后的头结点
206. Reverse Linked List
A -> B -> C
prev cur next
思路是按顺序来,先记录next的地址,然后将cur.next指向prev,接着将prevcur向前平移,直到cur为null
时间复杂度是O(n),空间复杂度为O(1)
迭代实现

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode prev = null, cur = head;
        while(cur != null){  //不能使cur.next != null,那样会错过最后一个节点的反向
            ListNode tmp = cur.next;
            cur.next = prev;
            prev = cur;
            cur = tmp;
        }
        return prev;  //cur为null时赋值结束,返回prev
    }
}

递归实现,思路是一样的

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null) return head;
        return helper(null, head);
    }
    
    public ListNode helper(ListNode prev, ListNode cur){
        ListNode node = cur.next;
        cur.next = prev;
        if(node != null) return helper(cur, node);
        else return cur;
    }
}

二、 翻转链表中的一部分
92. 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.

分析比较
这一题较上一题需要注意的是翻转中间的一部分与原链表的一个衔接
比如1->2->3->4->5->NULL,2 3 4进行翻转,翻转后为 4 3 2
需要将4放在1的后面,2的后面也是5
如果简单的像1那样处理,2的后面会是1,肯定是不对的
所以需要记录1和2的位置,即翻转开始前一个节点和第一个结点,在翻转完后整理赋值。

时间复杂度为O(n),空间复杂度为O(1)

迭代实现

class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        if(m == n) return head;
        
        //遍历到要翻转的部分,cur为要翻转的第一个节点
        //prev.next应该是翻转后的头结点
        ListNode cur = head, prev = null;
        for(int i = 1; i < m; ++i){
            prev = cur;
            cur = cur.next;
        }
        
        //cur是翻转后的尾节点,需要记录下来用于最后赋值
        ListNode end = cur, nextPtr = cur.next;
        for(int i = 1; i <= n - m; ++i){
            ListNode node = nextPtr.next;
            nextPtr.next = cur;
            cur = nextPtr;
            nextPtr = node;
        }
      
        //尾节点拼接到原串中
        end.next = nextPtr; 
        
        if(prev != null){
            prev.next = cur;
            return head;
        }else{  // m == 1
            return cur;
        }
    }
}

相关文章

  • 翻转链表系列

    一、 基本的翻转链表,给头结点,返回翻转后的头结点206. Reverse Linked ListA -> B -...

  • 牛客网高频算法题系列-BM3-链表中的节点每k个一组翻转

    牛客网高频算法题系列-BM3-链表中的节点每k个一组翻转 题目描述 将给出的链表中的节点每 k 个一组翻转,返回翻...

  • 翻转链表

    翻转链表 描述翻转一个链表 样例给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->nul...

  • 25. K 个一组翻转链表

    K个一组反转链表 翻转链表给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它...

  • 链表翻转

    给定单向链表,返回翻转后的链表

  • 链表

    1.翻转链表链表的定义 翻转 快慢指针找链表 的中间位置 3.有序链表的合并 4.判断链表中是否有环解法1: 借助...

  • Swift - LeetCode - 翻转链表

    题目 翻转链表 问题: 翻转链表中第m个节点到第n个节点的部分 说明: m,n满足1 ≤ m ≤ n ≤ 链表长度...

  • K 个一组翻转链表(递归,Kotlin)

    25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它...

  • leetcode第九十二题—反转链表 II

    又是一道升级题,还记得原来的翻转链表嘛,这个是要求指定m和n翻转链表。或许你忘了链表翻转怎么做,我编一个口诀:要问...

  • 【LeetCode】25.K个一组翻转链表

    题目描述 25.K个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k是一个正整数...

网友评论

      本文标题:翻转链表系列

      本文链接:https://www.haomeiwen.com/subject/oblmwxtx.html