/**
* 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转
*/
public class ReverseListNode02 {
public static ListNode reverseList(ListNode head, int m, int n){
ListNode temp = head;
ListNode before = new ListNode(0);
ListNode mid = null;
ListNode after = new ListNode(0);
ListNode forBefore = before;
ListNode forAfter = after;
//记录遍历到第几个位置
int count = 0;
while(temp != null){
count ++;
if(count < m){
ListNode node = temp.next;
forBefore.next = temp;
forBefore = forBefore.next;
forBefore.next = null;
temp = node;
}
//需要反转的链表节点
else if(count >= m && count <= n){
ListNode node1 = temp.next;
ListNode node2 = temp;
node2.next = mid;
mid = node2;
temp = node1;
}else{
ListNode node = temp.next;
forAfter.next = temp;
forAfter = forAfter.next;
forAfter.next = null;
temp = node;
}
}
//合并三段链表
ListNode start = before;
while(start.next != null){
start = start.next;
}
if(start.next == null){
start.next = mid;
}
ListNode middle = mid;
while(middle.next != null){
middle = middle.next;
}
if(middle.next == null){
middle.next = after.next;
}
if(before.next == null){
return mid;
}else{
return before.next;
}
}
public static void main(String[] args){
ListNode head = new ListNode(1);
ListNode node1 = new ListNode(8);
ListNode node2 = new ListNode(9);
ListNode node3 = new ListNode(4);
ListNode node4 = new ListNode(5);
head.next = node1;
node1.next = node2;
node2.next = node3;
node3.next = node4;
ListNode result = reverseList(head, 2, 3);
while (result != null){
System.out.println(result.val);
result = result.next;
}
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转,Java实现
最新推荐文章于 2022-07-05 15:44:40 发布