单链表反转

96 阅读2分钟

链表介绍

链表作为最基本的数据结构,它不仅在实际应用中有着非常重要的作用,而且也是程序员面试、笔试中必考的内容。具体而言,它的存储特点为:可以用任意一组存储单元来存储单链表中的数据元素(存储单元可以是不连续的),而且除了存储每个数据元素ai外,还必须存储指示其直接后继元素的信息。这两部分信息组成的数据元素 ai 的存储映像称为结点。N个结点链在一块被称为链表,当结点只包含其后继结点的信息的链表就被称为单链表,而链表的第一个结点通常被称为头结点。

就地逆序

就地逆序的思路是:遍历链表时,修改当前节点的指向,让其指向其前一节点;同时为避免链表断开,其前一节点将占据该节点的位置指向该节点的后一节点。注意此方法对链表首尾节点的特殊处理.

流程图

链表逆置-原地逆置.jpg

代码(Java)

//判断链表长度是否为空或1,此时返回自身即可
if (headNode == null || headNode.getNext() == null)
    return;
//中间量
LinkedNode beg = null,end = null,tmp = null;
//对首部的处理,由于链表第一个节点的前面是null,
beg = headNode;//链表第一个元素
end = headNode.getNext();//链表第二个元素
beg.setNext(end.getNext());//将链表第一个元素和链表第三个元素建立链接
end.setNext(beg);//第二个元素和第一个元素倒置

while (beg.getNext() != null){

    tmp = beg;
    beg = beg.getNext();
    tmp.setNext(beg.getNext());
    
    beg.setNext(end);
    end = beg;
    beg = tmp;
}

经过代码后,end会变成第一个节点。

递归法

递归法的思路是,首先找到尾节点,将尾节点和倒数第二节点换位。然后依次将倒二和倒三做处理最后到第一个。

流程图

链表逆置-递归法.jpg

代码(Java)

public static LinkedNode reserveLinked02(LinkedNode node){
    System.out.println(count);
    count++;
    if (node == null || node.getNext() == null){
        return node;
    }
    LinkedNode newNode = reserveLinked02(node.getNext());//这里是从头节点后面一个节点开始逆序
    node.getNext().setNext(node);//互换位置
    System.out.println();
    //头节点变成最后一个,不然链表成环了
    node.setNext(null);
    return newNode;
}