问题描述:给你单链表的头指针和两个整数left和right,其中left<=right.请你反转从位置left到right位置的链表节点,返回反转后的链表。三指针求解:首先定义一个指针指向反转链表前的那一个位置pre,然后找到反转链表最后那个位置的后一个位置,断开呈三个链表,反转中间那部分需要进行反转的链表。然后将其连接起来即可。
public void traverse(ListNode root,ListNode parent)
{
if(root==null){return;}
traverse(root.next,root);
root.next=parent;
}public ListNode reverseList(ListNode root,int begin,int end)
{
ListNode head=root;
ListNode pre=root;
for(int i=0;i<begin-2;i++)
{
pre=pre.next;
}
ListNode mid=pre.next;
pre.next=null;
ListNode later=root;
for(int i=0;i<end-2;i++)
{
later=later.next;
}
ListNode lastMidNode=later;
later=later.next;
tempNode.next=null;
//至此第一条链头指针指向头结点head,第二条链指针指向mid,第三条链指向later
traverse(mid);
pre.next=lastMidNode;
mid.next=later;
}
头插法解决:首先找到要处理的中间链表的前一个节点然后一直进行头插操作,直到找到最后一个中间链表。
public ListNode reverseList(ListNode root,int begin,int end)
{
ListNode pre=root;
for(int i=0;i<begin-1;i++)
{
pre=pre.next;
}
ListNode cur=pre.next;
for(int i=0;i<end-begin;i++)
{
ListNode next=cur.next;
cur.next=next.next;
next.next=pre.next;
pre.next.next;
}
return root;
}