反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
思路:
• 扫描一趟完成,先走到需要反转的地方,记录反转节点的前一个节点为连接节点 con;
• 反转的第一个节点为 反转链表的尾节点,记为 tail;
• 在 m ~ n区间反转链表,反转链表结束后,头结点为 pre,下一个正常节点为 cur;
• 则 con -> pre , tail -> cur,当 m==1时, con为null,需要特殊处理。
class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { ListNode pre = null, cur = head; while(m > 1){ pre = cur; //先走到需要反转的地方,记录反转的前一个节点为 pre cur = cur.next; //记录需要反转的起始节点为 cur m--; n--; } ListNode con = pre, tail = cur; // m == 1时,con == null //记录链接节点为 con,反转中的尾节点为 tail ListNode tmp = null; //记录反转中的,下一个头结点 while( n > 0){ tmp = cur.next; cur.next = pre; //反转链表 pre = cur; cur = tmp; n--; } if(con == null) head = pre; //如果连接点为 null 值,更新头结点 else con.next = pre; //否则,反转节点的头节点,与前面的连接点链接起来 tail.next = cur; //反转节点的尾节点,连接到剩余节点 return head; } }