来源Leetcode第92题反转链表II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL 
憨批写法
写的时候没考虑到一些特殊条件,用了太多的if了判断特殊情况,但是用时0ms,击败了100% hhh
思路就是找到要交换的部分,然后切开,交换那部分链表,在重新连接即可。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 
 | public ListNode reverseBetween(ListNode head, int m, int n) {if(head == null || head.next == null || m ==1 && n == 1)
 return head;
 ListNode p1 = head;
 int i = 1;
 while(i < m - 1){
 
 p1 = p1.next;
 i++;
 }
 ListNode p2 = p1.next;
 i++;
 while(i < n){
 
 p2 = p2.next;
 i++;
 }
 ListNode newHead,newCur;
 if(m == 1)
 newHead = head;
 else newHead = p1.next;
 newCur = p2;
 p2 = p2.next;
 newCur.next = null;
 newCur = null;
 if(m != 1)
 p1.next = null;
 while(newHead != null){
 ListNode temp = newHead.next;
 newHead.next = newCur;
 newCur = newHead;
 newHead = temp;
 }
 if(m == 1)
 p1 = newCur;
 else
 p1.next = newCur;
 while(newCur.next != null)
 newCur = newCur.next;
 newCur.next = p2;
 if(m == 1)
 return p1;
 return head;
 }
 
 | 
简洁
在题解里找到了一个写的相对比较简洁的代码,思路大概是差不多的
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 
 |     public ListNode reverseBetween(ListNode head, int m, int n) {ListNode tail = head;
 ListNode pre = head;
 
 for(int i=1; i<m; ++i)
 {
 pre = tail;
 tail = tail.next;
 }
 
 n -= m;
 ListNode sub_head = tail;
 
 while(n-- != 0){
 ListNode h = tail.next;
 tail.next = h.next;
 h.next = sub_head;
 sub_head = h;
 if(m != 1)
 pre.next = sub_head;
 }
 
 if(m != 1)
 return head;
 return sub_head;
 }
 
 |