反转链表II(根据指定的索引,逆转链表)

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转

思想:首先判断链表是否合法,并且判断输入的m和n是否合法

定义dummyHead结点,让它指向头结点的前驱,再定义cur,让它指向dummyHead,找到m位置的前驱结点,让cur指向它,接下来的操作和链表逆序一样,只不过只进行n-m次。

代码如下:

public ListNode reverseBetween(ListNode head, int m, int n) {
        //链表长度
        int length = getLength(head);
        int t = n - m;
        //判断链表是否合法,并且m和n是否合法
        if(length<n || m>=n || head == null || head.next == null) return head;
        //定义头结点的前驱结点
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;
        //定义临时结点,指向dummyHead
        ListNode cur = dummyHead;
        //让cur指向m位置结点的前驱结点
        while(m>1){
            cur = cur.next;
            m--;
        }
        //逆转链表n-m次
        ListNode f = cur.next;
        ListNode s = f.next;
        while(s!=null && t>0){
            f.next = s.next;
            s.next = cur.next;
            cur.next = s;
            s = f.next;
            t--;
        }
        //返回
        return dummyHead.next;
    }
    //求链表长度
    public static int getLength(ListNode head){
        int count = 0;
        while(head!=null){
            head = head.next;
            count++;
        }
        return count;
    }

 

posted @ 2019-04-02 06:21  码到成功hy  阅读(315)  评论(0编辑  收藏  举报
获取

hahah

name age option