题目
- 原题连接:92. 反转链表 II
1- 思路
模式识别:翻转 给定 left 和 right 固定区间的链表 ——> ①虚拟头结点 + ②三个指针方式实现
2- 实现
⭐92. 反转链表 II——题解思路
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode pre = dummyHead;
for(int i = 1 ; i < left;i++){
pre = pre.next;
}
ListNode cur = pre.next;
ListNode next = null;
for(int i = 0 ; i < right - left;i++){
next = cur.next;
cur.next = next.next;
next.next = pre.next;
pre.next = next;
}
return dummyHead.next;
}
}
3- ACM实现
public class reverse {
static class ListNode{
int val;
ListNode next;
ListNode(){}
ListNode(int x){
val = x;
}
}
public static ListNode reverseList(ListNode head,int left,int right){
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode pre = dummyHead;
for(int i = 1 ; i < left;i++){
pre = pre.next;
}
ListNode cur = pre.next;
ListNode next =null;
for(int i = 0 ; i < right-left;i++){
next = cur.next;
cur.next = next.next;
next.next = pre.next;
pre.next = next;
}
return dummyHead.next;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入链表长度");
int n =sc.nextInt();
ListNode head = null,tail = null;
for(int i = 0 ; i < n;i++){
ListNode newNode = new ListNode(sc.nextInt());
if(head==null){
head = newNode;
tail = newNode;
}else{
tail.next = newNode;
tail = newNode;
}
}
System.out.println("输入第一个元素");
int left = sc.nextInt();
System.out.println("输入第二个元素");
int right = sc.nextInt();
ListNode forRes = reverseList(head,left,right);
while(forRes!=null){
System.out.print(forRes.val+" ");
forRes = forRes.next;
}
}
}