题解 | #反转部分单向链表#(三指针法)

反转部分单向链表

https://www.nowcoder.com/practice/f11155006f154419b0bef6de8918aea2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.List;

class Node {

    private Node next;

    private int value;

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

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }


    public static Node createNodeList(Integer[] values) {
        Node head = new Node((values[0]));
        Node node = head;
        for (int i = 1; i < values.length; i++) {
            Node newNode = new Node(values[i]);
            node.next = newNode;
            node = newNode;
        }
        return head;
    }

    public static Node createNodeList(String[] values) {
        Node head = new Node(Integer.parseInt(values[0]));
        Node node = head;
        for (int i = 1; i < values.length; i++) {
            Node newNode = new Node(Integer.parseInt(values[i]));
            node.next = newNode;
            node = newNode;
        }
        return head;
    }
}

class LinkReverse {

    public static StringBuilder linkReverse(Node head, int len, int left,int right) {
        StringBuilder sb = new StringBuilder();
        if(left>right||left>len||right>len)return sb;
        //找left节点和right节点
        Node left_node=findNode(head,len+1-left);
        Node right_node=findNode(head,len+1-right);
        //left节点的前一个节点,若存在则给出,若不存在则为null(不存在说明left为头节点)
        Node left_forward=null;
        if(len+2-left<=len){
            left_forward=findNode(head,len+2-left);
        }
        //开始反转
        if (right - left > 0) {
            Node n1 = left_node;
            Node n2 = n1.getNext();
            Node n3 = n2.getNext();
            while (n1 != right_node) {
                n2.setNext(n1);
                n1 = n2;
                n2 = n3;
                if (n3 != null)n3 = n3.getNext();
            }
            left_node.setNext(n2);
            if(left_forward!=null){
                left_forward.setNext(n1);
            }else{
                head=n1;//若left节点为头结点,说明头结点被翻转了,head需指向翻转的尾部
            }
        }
        //输出
        Node n = head;
        while (n != null) {
            sb.append(n.getValue()).append(" ");
            n = n.getNext();
        }
        return sb;
    }

    //找倒数第x个节点
    public static Node findNode(Node head, int x) {
        Node n_fast = head;//快指针
        Node n_low = head;//慢指针
        //快指针先走k步
        for (int i = 0; i < x; i++) {
            n_fast = n_fast.getNext();
        }
        //快慢指针一起走,到快指针走完为止,慢指针刚好指向目标位置
        while (n_fast != null) {
            n_fast = n_fast.getNext();
            n_low = n_low.getNext();
        }
        return n_low;
    }

}


public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(input.readLine());
        String[] strings1 = input.readLine().split(" ");
        Node head = Node.createNodeList(strings1);
        String[] strings2 = input.readLine().split(" ");
        int l = Integer.parseInt(strings2[0]);
        int r = Integer.parseInt(strings2[1]);
        System.out.print(LinkReverse.linkReverse(head, n, l, r).toString());
    }


}

#你的秋招进展怎么样了##极智嘉Geek2021春招启动##好的APP推送需要满足什么条件#
全部评论

相关推荐

点赞 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1151896次浏览 17149人参与
# 通信和硬件还有转码的必要吗 #
11208次浏览 101人参与
# OPPO开奖 #
19213次浏览 267人参与
# 和牛牛一起刷题打卡 #
19005次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203409次浏览 3627人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4974次浏览 30人参与
# 不去互联网可以去金融科技 #
20446次浏览 256人参与
# 通信硬件薪资爆料 #
265943次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2227次浏览 34人参与
# 互联网公司评价 #
97710次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25037次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454891次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53910次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14646次浏览 349人参与
# 硬件人的简历怎么写 #
82289次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19398次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28147次浏览 248人参与
# 学历对求职的影响 #
161248次浏览 1804人参与
# 你收到了团子的OC了吗 #
538761次浏览 6387人参与
# 你已经投递多少份简历了 #
344255次浏览 4963人参与
# 实习生应该准时下班吗 #
96986次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63525次浏览 622人参与
牛客网
牛客企业服务