题目
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
分析
拿例子来说,我们可以找到left的前序结点pre,链表翻转可以等同于不断的把left后面的结点往pre结点后面进行插入
public class LinkNode {
int val;
LinkNode next;
public LinkNode(int data) {
this.val = data;
this.next = null;
}
}
public class LinkList {
LinkNode head;
public LinkList() {
this.head = null;
}
public LinkNode getHead() {
return this.head;
}
//添加元素
public void addNode(int data) {
LinkNode node = new LinkNode(data);
if (this.head == null) {
this.head = node;
} else {
LinkNode cur = this.head;
while(cur.next != null) {
cur = cur.next;
}
cur.next = node;
}
}
//正序打印
public void print(LinkNode node) {
while(node != null) {
System.out.print(node.val);
System.out.print(" ");
node = node.next;
}
System.out.println();
}
public void partReverse(int left,int right) {
LinkNode dummy = new LinkNode(-1);
dummy.next = this.head;
LinkNode pre = dummy;
for(int i = 1;i<left;i++) {
pre = pre.next;
}
int tmp = right - left;
LinkNode cur = pre.next;
while(tmp > 0 && pre != null) {
if(cur != null && cur.next != null) {
LinkNode p = cur.next;
cur.next = p.next;
p.next = pre.next;
pre.next = p;
}
tmp--;
}
print(dummy.next);
}
}
public class reverseLinkedListII {
public static void main(String[] args) {
LinkList list = new LinkList();
list.addNode(1);
list.addNode(2);
list.addNode(3);
list.addNode(4);
list.addNode(5);
list.partReverse(2,4);
}
}