题目描述
给定一个单链表,在链表中把第 L 个节点到第 R 个节点这一部分进行反转。
输入描述:
n 表示单链表的长度。
val 表示单链表各个节点的值。
L 表示翻转区间的左端点。
R 表示翻转区间的右端点。
输出描述:
在给定的函数中返回指定链表的头指针。
示例1
输入
5
1 2 3 4 5
1 3
输出
3 2 1 4 5
备注:
1≤n≤1000000
1≤L≤R≤n
−1000000≤val≤1000000
解法一:又是一次过 激动
import java.io.*;
public class Main{
public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static ListNode creat(int len,String[] ss){
ListNode head = new ListNode(0);
ListNode r = head;
for(int i=0;i<len;i++){
ListNode node = new ListNode(Integer.parseInt(ss[i]));
r.next = node;
r = node;
}
return head.next;
}
public static ListNode reverse(ListNode head,int l,int r){
ListNode prenode = null;
ListNode tmp = head;
for(int i=1;i<l;i++){
prenode = tmp;
tmp = tmp.next;
}
ListNode pre = prenode;
ListNode next = null;
for(int i=l;i<=r;i++){
next = tmp.next;
tmp.next = pre;
pre = tmp;
tmp = next;
}
if(l!=1){
prenode.next.next = tmp;
prenode.next = pre;
}else{
head.next = tmp;
head = pre;
}
return head;
}
public static void main(String[] args) throws IOException{
int len = Integer.valueOf(br.readLine());
String[] ss = br.readLine().trim().split(" ");
String[] lr = br.readLine().trim().split(" ");
int l = Integer.parseInt(lr[0]);
int r = Integer.parseInt(lr[1]);
ListNode head = creat(len,ss);
head = reverse(head,l,r);
StringBuilder sb = new StringBuilder();
while(head!=null){
sb.append(head.val).append(" ");
head = head.next;
}
System.out.print(sb.toString());
}
}
class ListNode{
int val;
ListNode next;
public ListNode(int val){
this.val = val;
this.next = next;
}
}