1、要非常熟练翻转链表的代码
2、对于节点,一定要走对,确定是你想要的节点,同时考虑边界值,当为空怎么办,同时一个链表的头结点反转之后就变成该链表的尾节点了
3、对于TLE的代码,很有可能是末尾链表没断开,重点考虑。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head == null || head.next == null || m == n) return head;
int count =0;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode h = head ,pre = null;
while(true){
count++;
if(count == m) break;
pre = h;
h = h.next;
}
ListNode firstEnd = pre;
ListNode secondBegin = h;
while(true){
if(count == n+1) break;
count++;
pre = h;
h= h.next;
}
ListNode secondEnd = pre;
secondEnd.next = null;
if(firstEnd != null){
firstEnd.next = reverseList(secondBegin);
}
else{
dummy.next = reverseList(secondBegin);
}
ListNode thirdBegin = h;
secondBegin.next = thirdBegin;//second链表反转之后,头结点就变成尾节点
return dummy.next;
}
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode pre = null, cur = head, next = head.next;
while (next != null) {
cur.next = pre;
pre = cur;
cur = next;
next = next.next;
}
cur.next = pre;
return cur;
}
}