刷题之反转部分单向链表

简介: 刷题之反转部分单向链表

e1420af0b59b48dea9fe07187bf1e087.png

一、题目解读

题目要求我们输入单链表长度和单链表各个节点的值及反转区间的左右端点,并且编写程序建立单链表及反转单链表

二、思路分析

找到开始反转的子链表头节点,然后开始常规的反转操作

反转前(添加一个pre头节点,方便修改head头节点)


7393953a784840968588192ed5be8f90.png

反转后(添加一个pre头节点,方便修改head头节点)


13b3fac89a65462fa8f3fc95703996fa.png

三、代码

import java.util.Scanner;
//单链表
class Node {
    public int val;
    public Node next;
    public Node(int val) {
        this.val = val;
        this.next = null;
    }
}
public class Main {
//反转单链表
    public static Node reversePartNode(Node head, int l, int r){
        int i=0;
        Node pre=new Node(0);
        pre.next=head;
        Node node=pre;
        Node left=null;
        Node leftPre=null;
        Node right=null;
        while (node!=null){
            if (i+1==l){
                leftPre=node;
                left=node.next;
            }
            if (i==r){
                right=node;
                break;
            }
            i++;
            node=node.next;
        }
        node=left;
        Node curNext=node.next;
        Node next=curNext.next;
        left.next=right.next;
        while (l!=r){
            curNext.next=node;
            node=curNext;
            curNext=next;
            if (next.next!=null)
            next=next.next;
            l++;
        }
        leftPre.next=right;
        if (left==head)
            pre.next=right;
        return pre.next;
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int []arr=new int[n];
        for (int i=0;i<n;i++){
            arr[i]=sc.nextInt();
        }
        int l=sc.nextInt();
        int r=sc.nextInt();
        Node head=new Node(arr[0]);
        Node node=head;
//构建单链表
        for (int i=1;i<n;i++){
            Node cur=new Node(arr[i]);
            node.next=cur;
            node=node.next;
        }
//反转单链表
        head=reversePartNode(head,l,r);
        node=head;
        while (node.next!=null){
            System.out.print(node.val+" ");
            node=node.next;
        }
        System.out.print(node.val);
    }
}


目录
相关文章
|
4月前
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
|
4月前
|
索引 Python
【Leetcode刷题Python】328. 奇偶链表
在不使用额外空间的情况下,将链表中的奇数和偶数索引节点重新排序的方法,并提供了相应的Python实现代码。
36 0
|
4月前
|
Python
【Leetcode刷题Python】25.K 个一组翻转链表
解决LeetCode "K 个一组翻转链表" 问题的三种方法:使用栈、尾插法和虚拟节点顺序法,并提供了每种方法的Python实现代码。
36 0
|
2月前
|
存储
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)(一)
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)
|
2月前
|
算法 Java
数据结构与算法学习六:单向环形链表应用实例的约瑟夫环问题
这篇文章通过单向环形链表的应用实例,详细讲解了约瑟夫环问题的解决方案,并提供了Java代码实现。
24 0
|
2月前
|
存储 缓存
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)(二)
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)
|
4月前
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
30 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
4月前
【刷题记录】链表的回文结构
【刷题记录】链表的回文结构
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
45 4