首页 > 试题广场 >

反转部分单向链表

[编程题]反转部分单向链表
  • 热度指数:3355 时间限制:C/C++ 4秒,其他语言8秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个单链表,在链表中把第 L 个节点到第 R 个节点这一部分进行反转。

输入描述:
n 表示单链表的长度。

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

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

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


输出描述:
在给定的函数中返回指定链表的头指针。
示例1

输入

5
1 2 3 4 5
1 3

输出

3 2 1 4 5

备注:



class ListNode{
    public int val;
    public ListNode next;
    public ListNode(int val){
        this.val = val;
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int length = scanner.nextInt();
        int[] val = new int[length];
        for (int i = 0; i < length; i++) {
            val[i] = scanner.nextInt();
        }
        int left = scanner.nextInt();
        int right = scanner.nextInt();
        ListNode head = new ListNode(val[0]);
        ListNode cur = head;
        for (int i = 1; i < length; i++) {
            cur.next = new ListNode(val[i]);
            cur = cur.next;
        }
        head = reversePartLinkedList(head,left,right);
        while (head != null){
            System.out.print(head.val + " ");
            head = head.next;
        }
    }

    private static ListNode reversePartLinkedList(ListNode head, int start, int end) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode prev = dummy;

        for (int i = 1;i < start;i++){
            prev = prev.next;
        }
        ListNode prev2 = prev.next;
        ListNode prev3 = prev.next;
        ListNode cur = prev2.next;
        for (int i = start; i < end; i++) {
            ListNode curNext = cur.next;
            cur.next = prev2;
            prev2 = cur;
            cur = curNext;
            prev3.next = curNext;
        }
        prev.next = prev2;
        return dummy.next;
    }
}

发表于 2023-04-19 22:06:02 回复(0)
import java.util.Scanner;

/*
 * 反转部分单向链表
 */
class Node {
    int val;
    Node next;
    public Node(int val) {//构造方法
        super();
        this.val = val;
        this.next = null;
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int len = sc.nextInt();
        int []value = new int[len];

        for (int i = 0; i < len; i++) {
            value[i] = sc.nextInt();
        }

        int left = sc.nextInt();
        int right = sc.nextInt();

        reverse( value, left-1, right-1);
        Node head = arrayToList(value);
        Node node;
        for (node = head; node.next != null; node = node.next) {
            System.out.print(node.val + " ");
        }
        System.out.print(node.val);
    }
    public static void reverse(int []value, int left, int right) {
        while (left < right) {
            int tmp = value[left];
            value[left] = value[right];
            value[right] = tmp;
            left++;
            right--;
        }
    }
    public static Node arrayToList(int []value) {
        Node head = new Node(-1);
        Node node = head;
        for (int i = 0; i < value.length; i++) {
            Node newNode = new Node(value[i]);
            node.next = newNode;
            node = newNode;
        }
        return head.next;
    }
}

发表于 2023-04-09 17:50:15 回复(0)
import java.util.*;
class ListNode{
    int val;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
    }
}
public class Main {
    static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        int n = scanner.nextInt();
        ListNode head = create(n);
        int left = scanner.nextInt();
        int right = scanner.nextInt();
        head = partReserve(head, left, right);
        print(head);
    }
    private  static void print(ListNode head){
        while(head!=null){
            System.out.print(head.val+" ");
            head=head.next;
        }
    }
    private static ListNode partReserve(ListNode head,int left,int right) {
        if (head == null || left == right)
            return head;
        //start指向left结点的前驱结点
        ListNode ph = new ListNode(-1);
        ph.next = head;
        ListNode start = ph;
        int x=left;
        while (x-- > 1)
            start = start.next;
        
        ListNode cur = start.next;
        ListNode phead = cur;
        //cur 指向第left个结点
        ListNode curnext = cur.next;

        while (curnext != null && left < right) {
            ListNode tmp = curnext.next;
            curnext.next = cur;
            cur = curnext;
            curnext = tmp;
            left++;
        }
        start.next = cur;
        phead.next = curnext;
        return ph.next;
    }
    private static ListNode create(int n) {
        ListNode head = new ListNode(0);
        ListNode cur = head;
        while (n-- > 0) {
            cur.next = new ListNode(scanner.nextInt());
            cur = cur.next;
        }
        return head.next;
    }
}

发表于 2022-09-09 14:04:01 回复(0)

问题信息

上传者:小小
难度:
3条回答 7183浏览

热门推荐

通过挑战的用户

查看代码