单链表反转问题

作者: craneyuan | 来源:发表于2016-10-08 21:35 被阅读97次

基本问题

如何将单链表反转?

单链表结构定义

/**
 * Description: Definition for singly-linked list.
 * 
 * @author: crane-yuan
 * @date: 2016-9-17 下午12:11:13
 */
public class ListNode {
    public int      val;
    public ListNode next;

    public ListNode(int x) {
        val = x;
    }
}

算法实现

/**
 *
 * Description: 单链表反转.
 *
 * @param  head
 * @return  ListNode
 */
public   static  ListNode reverseList(ListNode head)
{
    if  (head ==  null ) {
        return  head;
    }
    ListNode prev =  null ;
    ListNode current = head;
    ListNode next =  null ;
    while  (current !=  null ) {
        next = current. next ;
        current. next  = prev;
        prev = current;
        current = next;
    }
    head = prev;
    return  head;
}

进阶问题

如何将单链表在指定区间内进行反转?

问题分析

这个问题是上面问题的一个变形,难度也加大了不少,主要的难点之处就在于对边界条件的检查。
实现思路,主要就是按照给定的区间得到需要整体反转的一个子链表然后进行反转,最后就是把链表按正确的顺序拼接在一起。

算法实现


/**
 *
 * Description: 单链表反转,反转制定区间内的节点.
 *
 * @param  head
 * @param  m
 * @param  n
 * @return  ListNode
 */
public   static  ListNode reverseBetween(ListNode head,  int  m,  int  n)
{
    // 合法性检测
    if  (head ==  null  || m >= n || m < 1 || n < 1) {
        return  head;
    }
    /**
    * 将链表按[m,n]区间分成三段.
    *
    * first,second,third分别为每一段的头节点(注意,m=1也就是first与second相等的情况的处理)
    * first --> firstTail
    * second
    * third
    */
    ListNode first = head;
    ListNode firstTail = first;
    ListNode second = first;
    ListNode third = first;
    ListNode current = first;
    int  i = 0;
    while  (current !=  null ) {
        i++;
        if  (i == m - 1) {
            firstTail = current;
        }
        if  (i == m) {
            second = current;
        }
        if  (i == n) {
            third = current. next ;
            break ;
        }
        current = current. next ;
    }
    // 进行中间second段的reverse
    current = second;
    ListNode prev = third;
    ListNode next =  null ;
    while  (current != third) {
        next = current. next ;
        current. next  = prev;
        prev = current;
        current = next;
    }
    if  (m == 1) {
        first = prev;
    }  else  {
        firstTail. next  = prev;
    }
    return  first;
}

相关文章

  • Java、Python3 实战 LeetCode 高频面试之单链

    单链表反转 单链表反转这道题可谓是链表里面的高频问题了,差不多可以说只要被问到链表,就会问单链表反转。 今天我们就...

  • 单链表反转问题

    基本问题 如何将单链表反转? 单链表结构定义 算法实现 进阶问题 如何将单链表在指定区间内进行反转? 问题分析 这...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

  • 单链表反转

    单链表 单链表反转 递归方法

  • 反转单链表Java实现

    问题描述 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 解题思路 为了实现反转单链表,...

  • 链表简单算法相关练习

    单链表反转: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 迭代方式实现: 复杂度分析: 时...

  • 5个链表的常见操作

    链表 链表反转 LeetCode206:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 环路检...

  • 反转链表

    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

  • 单链表的就地逆置--java实现(含头节点和不包含头节点)

    前沿:链表是面试中经常问道的知识点,比如链表反转,就地反转,判断单链表是否相交,判断链表是否有环等都是常问的问题....

  • 【教3妹学算法】2道链表类题目

    题目1:反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head ...

网友评论

    本文标题:单链表反转问题

    本文链接:https://www.haomeiwen.com/subject/znfpyttx.html