链表介绍
链表作为最基本的数据结构,它不仅在实际应用中有着非常重要的作用,而且也是程序员面试、笔试中必考的内容。具体而言,它的存储特点为:可以用任意一组存储单元来存储单链表中的数据元素(存储单元可以是不连续的),而且除了存储每个数据元素ai外,还必须存储指示其直接后继元素的信息。这两部分信息组成的数据元素 ai 的存储映像称为结点。N个结点链在一块被称为链表,当结点只包含其后继结点的信息的链表就被称为单链表,而链表的第一个结点通常被称为头结点。
就地逆序
就地逆序的思路是:遍历链表时,修改当前节点的指向,让其指向其前一节点;同时为避免链表断开,其前一节点将占据该节点的位置指向该节点的后一节点。注意此方法对链表首尾节点的特殊处理.
流程图
代码(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会变成第一个节点。
递归法
递归法的思路是,首先找到尾节点,将尾节点和倒数第二节点换位。然后依次将倒二和倒三做处理最后到第一个。
流程图
代码(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;
}