美文网首页陪你刷算法系列
清清楚楚 单链表反转(逆置)

清清楚楚 单链表反转(逆置)

作者: SHAN某人 | 来源:发表于2018-01-10 12:30 被阅读17次
解题考虑

1. 使用额外辅助空间的反转

这样增加了空间复杂度 ,但是实现起来比较容易,不太容易被指针的问题绕晕。
下面给出示例代码

构造链表及初始化

import java.util.Scanner;

/**
 * Created by bruce_shan on 2018/1/10 11:15.
 * Corporation CSU Software  单链表逆置
 */
public class LinkRevert {
     static class  Node
    {
        int data;
        Node next;
    }

    // 插入节点
    static void  insertNode(Node list, Node addNode)
    {
        addNode.next = list.next;
        list.next= addNode;
    }
    // 遍历链表
    static void  printList2(Node list)
    {
        while ((list.next!=null))
        {
            list = list.next;
            System.out.print(list.data + "-->");

        }
        System.out.println();
    }
    // 链表初始化
      static Node init_List()
    {
        Node list = new Node();
        list.next = null;
        Scanner scanner  = new Scanner(System.in);
        int data = scanner.nextInt();
        while (data!=-1)
        {
            Node node = new Node();
            node.data =  data;
            insertNode(list,node);
            data = scanner.nextInt();
        }
        printList2(list);
        return  list;
    }
    public static void main(String[] args) {
        Node list =  init_List();  // 链表初始化
        revert_List(list);
    }
}

解法1:一边遍历原链表一边头插法建新链表

    // 链表逆置  遍历原链表 新建一个链表头插法
    static Node revert_List(Node list)
    {
        Node newList = new Node();
        newList.next = null;
        while ((list.next!=null))
        {
            list = list.next;
            Node temp = new Node();
            temp.data = list.data;
            insertNode(newList,temp);   // 这里插入的节点直接传 list会有问题,会改变原链表
        }
        System.out.println("=====newList== ");
        printList2(newList);
        return newList;
    }

双big O(n) 解法
解法2:借助栈来实现

和解法1类似,这里不给出代码,看官自己实现一下吧。

2. 原地反转

    // 原地链表反转
    static Node revert_List2(Node list)
    {
        Node pRev = new Node();
        pRev.next = null;
        Node pTemp = list.next;
        Node pNext = pTemp;

        while(pNext!= null)
        {
            pNext = pTemp.next;
            pTemp.next = pRev.next;
            pRev.next = pTemp;
            pTemp = pNext;
        }
        printList2(pRev);
        return pRev;
    }

原地反转写法并不复杂,但是要理解清楚,就需要多画画图。

考虑初始状态,将pRev指针建头指针,将pTemp 指向原链表第一个节点(非头节点),pNext 先指向pTemp ,循环体内再指向pTemp下一个节点。

考虑中间状态,时刻记得三个指针分别承担的任务就清楚了。

这道题若还有其他挖掘的地方,欢迎大家交流讨论。

相关文章

  • 清清楚楚 单链表反转(逆置)

    1. 使用额外辅助空间的反转 这样增加了空间复杂度 ,但是实现起来比较容易,不太容易被指针的问题绕晕。下面给出示例...

  • 链表的逆置(又称反转)

    转自链表的逆置(又称反转)

  • 单链表就地转置

    试写一道算法,实现单链表的就地逆置(反转),即利用原表的存储空间将线性表(a1,a2,⋯an)逆置(反转)为(an...

  • 单链表逆置

    单链表逆置的思路 a:将单链表储存为数组,然后按照数组的索引逆序进行反转。b:使用3个指针遍历单链表,逐个链接点进...

  • 算法面试:链表转置

    //单链表定义 普通的循环的方法。 //单链表逆置实现 递归调用方法

  • 插入任意数据形成有序单链表并逆置单链表

    可直接运行的完整C语言版有序单链表的生成和逆置标签:数据结构、线性表、带头结点的单链表、逆置单链表欢迎与喜欢数据结...

  • 单链表翻转

    单链表的就地逆置:就地逆置即空间复杂度为O(1)一:用数组存储单链表的值,然后重新逆序赋值,效率较低。二:利用三个...

  • Algorithm小白入门 -- 单链表

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

  • 单向链表反转算法

    常用的4种: 迭代反转法 递归反转法 头插法 就地逆置法 1 迭代反转法 从当前链表的首元节点开始,一直遍历至链表...

  • 线性表之单链表实现

    线性表之单链表实现 实现单链表的初始化、插入、删除等基本运算 实现单链表的输入、输出运算 实现单链表的逆置、归并、...

网友评论

    本文标题:清清楚楚 单链表反转(逆置)

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