【LintCode】翻转链表 II

来源:互联网 发布:seo资源网 编辑:程序博客网 时间:2024/04/30 19:04

题目

给一个链表,然后我们要把这个链表中第m个节点到第n个节点的部分翻转。


给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->null


代码及注释

<span style="font-size:18px;">/** * Definition for ListNode * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    /**     * @param ListNode head is the head of the linked list      * @oaram m and n     * @return: The head of the reversed ListNode     */    public ListNode reverseBetween(ListNode head, int m , int n) {        // write your code      if(m>=n||head==null)      return head;      //在头结点之前引入一个结点,因为头结点可能被翻转,这样可以使得头结点的      //翻转和普通结点一样      ListNode before=new ListNode(0);      before.next=head;      head=before;      for(int i=1;i<m;i++){          if(head==null){          return null;          }          //因为前面在头结点之前引入了一个结点,所以这里head指向m的前一个结点          head=head.next;      }       //当前结点,即M位置的结点,未移动,始终指向M所在的结点      ListNode mNode=head.next;      ListNode dangqianNode=mNode;//当前结点,后面会对其进行移动,值会改变      ListNode next=mNode.next;//当前结点的下一个结点      ListNode mQianMianDeNode=head;//M前一个位置的结点,从未改变      for(int i=m;m<n;m++){          if(next==null)          return null;          ListNode temp=next.next;//记录当前结点的下一个结点的下一个结点          next.next=dangqianNode;//改变当前结点的下一个结点链表指向的方向,          //即将下一个结点的next指向当前结点          dangqianNode=next;//将当前结点向后移动          next=temp;//将当前结点的下个结点向后移动    /*      示例过程:      如:2->3->4      2是当前结点(dangqianjiedian )      3是当前结点的下一个结点(next)      4是当前结点的下个结点的下个结点(next.next)      temp=next.next; temp=4 记录next.next      next.next=dangqianNode; 3->2 改变链表指向的方向      dangqianNode=next;  dangqiangNode=3;      next=temp;  next=4          */      }      //避免链表断裂      //最开始的M之前的结点指向翻转后的当前结点      mQianMianDeNode.next=dangqianNode;      //最开始的M结点,(即还未翻转的M结点),//指向当前结点(翻转后)的下一个结点      mNode.next=next;            /*       1->2->3->4->5->null ;       M-N 翻转后 (4->3->2)       1指向翻转后当前的结点       1->4       2指向翻转后的下一个结点       2->5       完成后you有       1->4->3->2->5->null;             */      //返回在头结点前引入的结点的下一个结点      return before.next;    }   }</span>


0 0