(没过,以为简单,结构链表指针搞得很复杂出错。是有捷径的,很典型题目要记住)
反转链表 II(medium)
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
链接:https://www.nowcoder.com/questionTerminal/b58434e200a648c589ca2063f1faf58c
来源:牛客网
1.头插法
对于reverse部分有点迷糊。网上看到的解释,也许更能帮助理解.https://yq.aliyun.com/articles/3867
不妨拿出四本书,摞成一摞(自上而下为 A B C D),要让这四本书的位置完全颠倒过来(即自上而下为 D C B A):
盯住书A,每次操作把A下面的那本书放到最上面
初始位置:自上而下为 A B C B
第一次操作后:自上而下为 B A C D
第二次操作后:自上而下为 C B A D
第三次操作后:自上而下为 D C B A
public class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { ListNode dummy = new ListNode(0); dummy.next = head; ListNode preStart = dummy; ListNode start = head; for (int i = 1; i < m; i ++ ) { preStart = start; start = start.next; } // reverse for (int i = 0; i < n - m; i ++ ) { ListNode temp = start.next; start.next = temp.next; temp.next = preStart.next; preStart.next = temp; } return dummy.next; } }
我看了思路后:
public ListNode reverseBetween(ListNode head, int m, int n) { ListNode dummy = new ListNode(0); dummy.next = head; ListNode mpre = dummy; for (int i=1;i<m;i++) { mpre = mpre.next; } ListNode p1 = mpre.next; ListNode p2 = p1.next; for (int i=0;i<n-m;i++) { p1.next = p2.next; //p1不动 p2.next = mpre.next; mpre.next = p2; p2 = p1.next; } return dummy.next; }
2.三个指针向后遍历(我这样做但是死链了)
class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { if(head == null || m < 1 || m >= n ){ return head; } int i = 1; ListNode dummy = new ListNode(0); dummy.next = head; ListNode h1 = dummy; while (i < m){ i++; h1 = h1.next; } ListNode p1 = h1.next; ListNode p2 = p1.next; ListNode p3 = p2.next; while (i < n) { i++; p2.next = p1; p1 = p2; p2 = p3; if (p3 != null) { p3 = p3.next; } } h1.next.next = p2; h1.next = p1; return dummy.next; } }
再看反转链表 I很简单
反转链表 I
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
public ListNode reverseList(ListNode head) { if (head == null){ return null; } ListNode dummy = new ListNode(0); dummy.next = head; while(head.next != null) { ListNode p = head.next; head.next = p.next; p.next = dummy.next; dummy.next = p; } return dummy.next; }