首页 > 编程语言 >算法-26反转部分单向链表

算法-26反转部分单向链表

时间:2022-11-08 16:15:20浏览次数:33  
标签:Node 26 单向 head next 链表 node1 节点

描述

给定一个单链表,在链表中把第 L 个节点到第 R 个节点这一部分进行反转。

输入描述:

n 表示单链表的长度。

val 表示单链表各个节点的值。

L 表示翻转区间的左端点。

R 表示翻转区间的右端点。

输出描述:

在给定的函数中返回指定链表的头指针。

示例1

输入:
5
1 2 3 4 5
1 3

输出:
3 2 1 4 5

 

思路

想要反转第from到第to这部分的链表,必须要找到from节点前一个fPre节点,以及to节点后一个节点tPos节点。找到后,对第from到第to这部分的链表进行反转,再接上fPre节点和tPos节点。

实现过程:

1、利用len记录链表的长度,每走一个节点就加一。如果当len等于from-1,就说明此时的fPre就是当前node1,同理,tPos等于to+1时,tPos就是当前node1。

while(node1 != null) {
    len++;
    // 找到反转部分的前一个结点
    begin = len == from -1 ? node1:begin;
    // 找到反转部分的后一个结点
    end = len == to+1?node1:end;
    node1 = node1.next;
}

2、判断边界条件

if(from>to||from<1||to>len) {
    return head;
}

3、初始化node1和node2位置

node1初始化是反转部分链表的第一个节点。

node2初始化为反转部分链表的第二个节点。

fPre等于空的话,就将head作为node1,否则就将fPre的下一个节点作为node1

node1的下一个节点就是node2

  •  反转前先将node1指向tPos节点(反转后就是部分链表的最后一个节点)
  • 进行反转
  • 反转后将fPre节点指向部分链表最后一个节点node1(反转后就是部分链表的第一个节点)

 

代码如下:

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    public static class Node {
        public int value;
        public Node next;

        public Node(int value) {
            this.value = value;
        }
    }

    public static Node createList(int length,String[] numbers) {
        Node head = new Node(Integer.parseInt(numbers[0]));
        Node cur = head;
        for(int i=1;i<length;i++) {
            cur.next = new Node(Integer.parseInt(numbers[i]));
            cur = cur.next;
        }
        cur.next = null;
        return head;
    }

    public static Node reversePart(Node head,int from,int to) {
        int len = 0;
        Node node1 = head;
        Node begin = null;
        Node end = null;
        while(node1 != null) {
            len++;
            // 找到反转部分的前一个结点
            begin = len == from -1 ? node1:begin;
            // 找到反转部分的后一个结点
            end = len == to+1?node1:end;
            node1 = node1.next;
        }
        if(from>to||from<1||to>len) {
            return head;
        }
        node1 = begin == null ? head : begin.next;
        Node node2 = node1.next;
        node1.next = end;
        Node next = null;
        while(node2 != end) {
            next = node2.next;
            node2.next = node1;
            node1 = node2;
            node2 = next;
        }
        if(begin != null) {
            begin.next = node1;
            return head;
        }else {
            return node1;
        }
    }

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        scanner.nextLine();
        String[] listStr = scanner.nextLine().trim().split(" ");
        
        int from = scanner.nextInt();
        int to = scanner.nextInt();

        Node head = createList(n,listStr);
        head = reversePart(head,from,to);

        while(head != null) {
            System.out.print(head.value + " ");
            head = head.next;
        }
        System.out.println();
    }
}

 

标签:Node,26,单向,head,next,链表,node1,节点
From: https://www.cnblogs.com/sfnz/p/16870037.html

相关文章

  • 【Leetcode】 剑指offer:链表(简单)--Day02
    剑指Offer06.从尾到头打印链表可借助栈。或先遍历列表得到元素数,开辟数组空间倒序填入。剑指Offer24.反转链表可借助栈:classSolution{publicListNodere......
  • 【前端面试题】—26道HTTP和HTTPS的面试题(附答案)
    Web前端就是当用户在浏览器地址栏中输入一行字母看到的页面结果。然而,从输入字母到看到页面中都发生了什么,数据是怎么得到的?这些都离不开HTTP/HTTPS。然而,这部分内容通常被......
  • 【操作说明】全能型H.265播放器如何使用?
    本播放器集成了公司业务的接口,包含了实播,回放,云台控制和回放速度控制,截图和全屏功能可以根据type直接初始化接口地址如果是第三方业务对接,也可以单独配置接口地址正确使用......
  • Couchdb 垂直权限绕过漏洞(CVE-2017-12635)
    ApacheCouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。......
  • H264的RBSP类型之AUD
    AUD从哪来AccessUnitDelimiter访问单元分隔符以TS文件为例,下面开始剥洋葱~TS由一个一个188字节的TS数据包组成。有PCR和包计数(0-15)去掉TS包头,根据TS包的PID过滤,承载数据组......
  • python进阶(26)collections标准库
    前言这个模块实现了特定目标的容器,以提供Python标准内建容器dict,list,set,和tuple的替代选择。这个模块提供了以下几个函数函数作用namedtuple()创建命......
  • 二十、树、森林和二叉树(二叉链表)转换
    一、孩子兄弟表示法孩子兄弟表示法又称二叉树表示法,或二叉链表表示法,即以二叉链表做树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点......
  • day26 Vue相关内容及深拷贝和浅拷贝
    Vue相关内容概述:Vue是前端的一个Js库(诞生于2015年,兴起于2016年,尤雨溪写的(目前是阿里巴巴在维护)),vue是MVVM模式的框架.MVVM概述:model数据v......
  • 【每日一练】26—CSS实现响应式卡片悬停效果
    今天练习的这个小项目,是一个产品卡片式的介绍说明,像我们在一些个人简历产品说明里或者产品说明里会经常使用这样的内容设计,然后再配上合适的图片即可。例如,我们在个人简历上......
  • 【数据结构-链表】链表的相关算法
    目录1删除元素1.1删除值为x的所有结点1.1.1不带头结点的单链表1.1.2带头结点的单链表1.2删除重复元素1.2.1不带头结点的单链有序表1.2.2带头结点的单链有序表2链......