翻转链表 II

题目

翻转链表中第m个节点到第n个节点的部分

注意事项

m,n满足1 ≤ m ≤ n ≤ 链表长度

样例

给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->null

解题

只需要翻转其中一部分

根据结点值进行更新链表

时间复杂度:O(n)

空间复杂度:O(n)

/**
 * Definition for ListNode
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    /**
     * @param ListNode head is the head of the linked list
     * @oaram m and n
     * @return: The head of the reversed ListNode
     */
    public ListNode reverseBetween(ListNode head, int m , int n) {
        // write your code
        if(head==null || head.next == null || m<0 || n<0 || m>=n)
            return head;
        int len = getLength(head);
        ListNode p = head;
        if(m>len||n>len)
            return head;
        int i = m;;
        while(m>1){// 找到翻转的前一个结点
            m--;
            p = p.next;
        }
        // 记录需要翻转的结点值
        ArrayList<Integer> val = new ArrayList<Integer>();
        ListNode q = p;
        while(i<=n && q!=null){
            val.add(q.val);
            q = q.next;
            i++;
        }
        // 根据结点值更新原始链表
        for( i=val.size()-1;i >=0;i--){
            p.val = val.get(i);
            p = p.next;
        }
        return head;
    }
    public int getLength(ListNode head){
        int len = 0;
        ListNode p = head;
        while(p!=null){
            len++;
            p = p.next;
        }
        return len;
    }
}

上面违背了出题思想

下面找到翻转位置后进行翻转

参考链接

public class Solution {
    /**
     * @param ListNode head is the head of the linked list
     * @oaram m and n
     * @return: The head of the reversed ListNode
     */
    public ListNode reverseBetween(ListNode head, int m , int n) {
        // write your code
        if (m >= n || head == null) {
            return head;
        }

        ListNode dummy = new ListNode(0); // 插入头节点
        dummy.next = head;
        head = dummy;

        for (int i = 1; i < m; i++) { // 找到m节点前面一个节点
            if (head == null) {
                return null;
            }
            head = head.next;
        }

        ListNode premNode = head; // m 前节点
        ListNode mNode = head.next; // m 节点
        ListNode nNode = mNode;// n节点
        ListNode postnNode = mNode.next; // n 后节点
        // n 后节点 插入到n 节点之前
        for (int i = m; i < n; i++) {
            if (postnNode == null) {
                return null;
            }
            ListNode temp = postnNode.next; // 下一个节点
            postnNode.next = nNode;
            nNode = postnNode;
            postnNode = temp;
        }
        mNode.next = postnNode;// m next 指向 n 后
        premNode.next = nNode; // m 前节点 直线 n 

        return dummy.next;

    }
}
时间: 2024-10-13 01:58:12

翻转链表 II的相关文章

九章算法面试题73 翻转链表II

九章算法官网-原文网址 http://www.jiuzhang.com/problem/74/ 题目 给一个链表,然后我们要把这个链表中第m个节点到第n个节点的部分翻转. 在线测试本题 http://www.lintcode.com/en/problem/reverse-linked-list-ii/ 解答 为更好处理表头和第m个节点,引入dummy结点,因为头节点可能被翻转,dummy node使得头节点的翻转和普通节点翻转操作一样.由于我们翻转的是第m个节点到第n个节点,并且第m-1个节点的

[LeetCode系列]翻转链表问题II

给定一个链表和两个整数m, n, 翻转链表第m个节点到第n个节点(从1开始计数). 如, 给定链表: 1->2->3->4->5->NULL, 以及 m = 2, n = 4. 返回 1->4->3->2->5->NULL. 假定m和n满足约束条件: 1 ≤ m ≤ n ≤ 链表长度. 注意: 不能使用额外空间, 且只能遍历链表一次. 算法思路: 翻转的过程可以分解成3步: 把相邻的节点的指向关系倒置; 即 1->2<-3<-4

Leetcode 92. 反转链表 II

反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL 思路:分成两个情况来写第一种:如果m=1,那就是一道反转链表,先翻转m-n的节点,翻转后,头结点就变成了尾节点,所以把这些节点保存起来,然后再把后面的节点接到尾节点第二种:如果!=1,翻转m到n的中间节点即可 1 p

算法题——翻转链表中的一段

题目:给出一个链表中的两个指针p1和p2,将其之间的结点翻转. 思路:可以通过交换结点内的值来实现结点的翻转,空间为O(N):如果要求不能交换值,那么仅凭p1和p2是无法翻转的,只能交换两个指针之间的链表. 代码: 交换值: 1 struct ListNode 2 { 3 int val; 4 ListNode *next; 5 }; 6 7 void reverseNodes(ListNode *p1, ListNode *p2) { 8 if ( p1 == NULL || p2 == NU

[LintCode] Reverse Nodes in k-Group 每k个一组翻转链表

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is. You may not alter the values in the nodes, only nod

九章算法面试题72 翻转链表I

九章算法官网-原文网址 http://www.jiuzhang.com/problem/73/ 题目 给一个链表,然后我们要把这个链表进行翻转. 在线测试本题 http://www.lintcode.com/en/problem/reverse-linked-list/ 解答 对于这种翻转链表的问题,我们需要考虑怎么样一个一个节点从头到尾翻转,只用建立一个prev 节点,每次先用temp节点保存下一个节点信息,然后翻转当前节点,把它的next指针指向prev节点,然后在向前更新head指向当前遍

C语言递归,非递归实现翻转链表

翻转链表作为,链表的常用操作,也是面试常遇到的. 分析非递归分析: 非递归用的小技巧比较多,很容易出错. 递归分析比较简单,在代码里面 代码: #include<stdio.h> #include<stdlib.h> typedef int elemtype; typedef struct node{ elemtype element; struct node*next;//写成node* next;node * next;node *next;也是可以的,为了方便阅读,以后统一写

lintcode 容易题:Reverse Linked List 翻转链表

题目: 翻转链表 翻转一个链表 样例 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null 挑战 在原地一次翻转完成 解题: 递归还是可以解的 java程序: /** * Definition for ListNode. * public class ListNode { * int val; * ListNode next; * ListNode(int val) { * this.val = val; * this.next = nu

【LeetCode-面试算法经典-Java实现】【092-Reverse Linked List II(反转单链表II)】

[092-Reverse Linked List II(反转单链表II)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 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->