Reverse Linked List II
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL
, m = 2 and n = 4,
return 1->4->3->2->5->NULL
.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
思路:控制好链表的哨兵节点和尾部节点,要控制好使用到的每个节点的位置
java代码:
- public ListNode reverseBetween(ListNode head, int m, int n) {
- if(head==null || head.next==null) return head;
- if(m==n) return head;
- ListNode dummy = new ListNode(-1);
- dummy.next = head;
- ListNode pre = dummy;
- ListNode p = head;
- int i=1;
- for(i=1;i<m;i++) {
- pre = p;
- p = p.next;
- }
- ListNode start = p;
- while(i<n) {
- p = p.next; //p进入时为即将遍历到的上一个节点
- start.next = p.next;
- p.next = pre.next;
- pre.next = p;
- p = start;
- i++;
- }
- return dummy.next;
- }
C++代码:
- ListNode *reverseBetween(ListNode *head, int m, int n) {
- if(head==NULL || head->next==NULL) return head;
- if(m==n) return head;
- ListNode *dummy = new ListNode(0);
- dummy->next=head;
- ListNode *p=dummy;
- int i=0;
- for(i=1;i<m;i++) p=p->next;
- head=p->next; //head为每次要遍历到的节点
- i=i+1;
- while(i<=n) {
- ListNode *q=head->next;
- head->next=q->next;
- q->next=p->next;
- p->next=q;
- i++;
- }
- return dummy->next;
- }