对指定范围的链表,实现反转
java 实现
public class Test52 {
public static void main(String[] args) {
ListNode listNode1=new ListNode(1);
ListNode listNode2=new ListNode(2);
ListNode listNode3=new ListNode(3);
ListNode listNode4=new ListNode(4);
ListNode listNode5=new ListNode(5);
listNode1.next=listNode2;
listNode2.next=listNode3;
listNode3.next=listNode4;
listNode4.next=listNode5;
ListNode listNode = reverseBetween(listNode1,2,4);
while (listNode!=null){
System.out.println(listNode.val);
listNode=listNode.next;
}
}
/**
* @Description: 反转指定范围的链表,使用头插法,反转链表
*
* @Date: 2020/6/28 21:58
* @Author: fuguowen
* @Return
* @Throws
*/
public static ListNode reverseBetween(ListNode head, int m, int n) {
int i=0;
ListNode tempNode=new ListNode(0);
tempNode.next=head;
ListNode pre;
ListNode q;
pre=tempNode;
q=tempNode.next;
while(i<m-1){
pre=pre.next;
q=q.next;
i++;
}
//pre 指向第m-1个节点 next 指向第n个节点
for(int j=0;j<n-m;j++){
ListNode remove= q.next;
//让m-1的节点 指向m+1的节点
q.next=q.next.next;
remove.next=pre.next;
pre.next=remove;
}
return tempNode.next;
}
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
}
go 语言 实现
/**
* @Description: 反转指定范围的指针,反转从位置 m 到 n 的链表
*
* @Date:
* @Author: fuGuoWen
* @Return
* @Throws
*/
func reverseBetween(head *ListNode, m int, n int) *ListNode {
temp := ListNode{0, nil}
temp.Next = head
pre := &temp
q := temp.Next
count := 0
/** 找到第m-1个元素 */
for count < m-1 {
pre = pre.Next
q = q.Next
count++
}
//使用头插法更新指针的指向
for j := 0; j < n-m; j++ {
remove := q.Next
q.Next = q.Next.Next
remove.Next = pre.Next
pre.Next = remove
}
return temp.Next
}