韦到头打印链表

题目描述

输入一个链表,从尾到头打印链表每个节点的值。

输入描述:
输入为链表的表头
输出描述:
输出为需要打印的“新链表”的表头

/**

*    public class ListNode {

*        int val;

*        ListNode next = null;

*

*        ListNode(int val) {

*            this.val = val;

*        }

*    }

*

*/

import java.util.ArrayList;

import java.util.Stack;

public class Solution {

    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {

            ArrayList<Integer>  result=new ArrayList();

        if(listNode==null)

            return result;

        Stack<ListNode> stack=new Stack();

        stack.push(listNode);

        while(listNode.next!=null)

        {

            stack.push(listNode.next);

            listNode=listNode.next;

        }

        while(!stack.isEmpty())

        {

            ListNode node=stack.pop();

            result.add(node.val);

        }

        return result;

    }

}

链表结构之单链表

链表:一种数据存储结构.学链表首先要搞懂数组,按朋友的话说,数组和链表的关系就相当于QQ2008和QQ2009.
除非要通过索引频繁访问各个数据,不然大多数情况下都可以用链表代替数组.
链表部分主要要涉及:单链表,双端链表,有序链表,双向链表和有迭代器的链表(迭代器是用来随机访问链表元素的一种方法).
由于以前贪玩数据结构没上课,现在后悔所以要努力补上.

链结点:
链表中,每个数据项都被包含在"链结点"(Link)中.一个链结点是某个类的对象,这个类可以叫Link.而每个Link对象中又包含着一个对下一个链
结点引用的字段(通常叫next).但是链表(LinkList)本身的对象中有一个字段(first)指向第一个链结点的引用.看图会清晰些.
这张表体现在代码里就两个构造类:
Link(链结点类)

class Link {
    public int iData;
    public double dData;
    public Link next; // 这个next就是链结点对象对下个链接点的引用.默认初始化为NULL
    public Link(int id, double dd){
        iData = id;
        dData = dd;
    }
}

LinkList(链表类)

class LinkList {
    public Link first; // 首链结点first,初始化为NULL
    public  LinkList () {
        first = null;
    }
}

就这样一个链结点指向下个链结点的引用构成了整个链表.
今天这个实例,显示了一个单链表.主要的操作如下:
在链表头插入一个数据项.
在链表头删除一个数据项.
遍历链表显示内容.
首先插入一个链接点
的逻辑就是:将first的引用指向Link对象链结点的next引用,然后再将first指向这个链结点就构造了新的链表.如图

代码大框如下:

public void insertFirst(int id, double dd) {
    Link newLink = new Link(id, dd); // 构造新的链结点对象
    newLink.next = first; // 将链结点对象的next指向first的引用
    first = newLink;      // 然后将first指向newLink对象
}


除一个链结点的逻辑就是:用一个临时变量存储first的引用(即要删除的链结点)然后将first指向first.next(即他只想的链结点对象的
next指向的那个链结点Link).这样要删除的那个链结点就没有了指针对他的引用.Java垃圾回收就会把他收回.实现了并返回存储的那个删除节点.
如图
代码大框如下:

public Link deleteFirst() {
    Link temp = first; // 暂存first引用的这个链结点(即要删除的)
    first = first.next;// 将first指向他所引用的Link链接点的next引用
    return temp;       // 返回要删除的链结点
}

这要弄清了,Java对象引用的关系理解起来就很容易了.下面就是实现的整个代码:

Code

打印的结果为:

List: (first ---> last){88,88.88}{66,66.88}{44,44.88}{22,22.88}
{88,88.88}  Deleted
{66,66.88}  Deleted
{44,44.88}  Deleted
{22,22.88}  Deleted
List: (first ---> last)

继续扩展下添加查找对应键值和按对应键值删除链结点的find和delete方法.
find方法:
这个方法与上面的displayLink方法类似.将current定义为first,通过不断的current.next.iData与键值作比较,如果相等便返回当前引用.
如果一直到最后Null也没找到就返回Null
delete方法:
这个方法需要两个变量.current:当前链结点的引用 privious:前一链结点的引用.这个方法也是通过循环查找如果找到了
.就用前一引用的next指向当前的next的引用就可以了.见图

最后代码:

Code

执行结果:

List: (first ---> last){88,88.88}{66,66.88}{44,44.88}{22,22.88}
the Find Item: {22,22.88}  the Del Item: {22,22.88}
List: (first ---> last){88,88.88}{66,66.88}{44,44.88}

时间: 2024-10-10 01:40:31

韦到头打印链表的相关文章

《剑指Offer》题目——从尾到头打印链表

题目描述:输入一个链表,从尾到头打印链表每个节点的值. 题目分析:用栈:Java用Stack不如用Deque接口,原因可以见链接:http://stackoverflow.com/questions/12524826/why-should-i-use-deque-over-stack public class ReverseList { class ListNode{ int val; ListNode next = null; ListNode(int val){ this.val = val

从尾到头打印链表

参与人数:4164时间限制:1秒空间限制:32768K 通过比例:16.80% 最佳记录:0 ms|0K(来自  黄昏的足迹) 题目描述 输入一个链表,从尾到头打印链表每个节点的值. 提交时间:2015-09-25 语言:C++ 运行时间:0ms 占用内存:8552K 状态:答案正确 /* 遍历一次链表,每遍历到一个结点,就将结点的值插入到vecotr的开始. */ /** * struct ListNode { * int val; * struct ListNode *next; * Lis

5-从尾到头打印链表

题目描述:http://ac.jobdu.com/problem.php?pid=1511 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推.当输入到-1时代表链表输入完毕.-1本身不属于链表. 输出: 对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行. 逆序打印链表,我们遍历链表只能从头到尾,现在要求我们从尾到头.后进先出,可以想到用

九度oj题目1511:从尾到头打印链表

题目1511:从尾到头打印链表 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:6010 解决:1805 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例.每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推.当输入到-1时代表链表输入完毕.-1本身不属于链表. 输出: 对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行. 样例输入: 1 2 3 4 5 -1 样例输出

《剑指offer》— JavaScript(3)从尾到头打印链表

从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值. 实现代码 /*function ListNode(x){ this.val = x; this.next = null; }*/ function printListFromTailToHead(head) { var res=[]; while(head){ res.unshift(head.val); head=head.next; } return res; } 相关知识 创建一个链表,并实现插入,删除,添加的方法

从尾到头打印链表-剑指Offer

从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值 输入描述 输入为链表的表头 输出描述 输出为需要打印的“新链表”的表头 思路 单向链表是从头到尾指向的,从尾到头打印符合“后进先出”,所以我们使用栈结构Stack 代码 import java.util.ArrayList; import java.util.Stack; public class Solution03 { public ArrayList<Integer> printListFromTailToHead(

输入一个链表,从尾到头打印链表每个节点的值

题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入描述: 输入为链表的表头 输出描述: 输出为需要打印的"新链表"的表头 用栈处理: /** *    public class ListNode { *        int val; *        ListNode next = null; * *        ListNode(int val) { *            this.val = val; *        } *    } * */ import 

剑指offer | 从尾到头打印链表

题目描述: “输入一个链表,从尾到头打印链表每个节点的值.” 这是我做的<剑指offer>系列的第一题,好的开头就是成功的一半.然而,我提交了一次,WA!再提交,WA!Com'on! 看来我的开端并不顺利.不过我要的可不是成功的一半,这样的开端怎么能阻挡我AC之路!仔细看了一遍题目要求,看了提交格式.再提交! Finally,AC! 代码如下: 1 /** 2 * struct ListNode { 3 * int val; 4 * struct ListNode *next; 5 * Lis

剑指Offers 题目1511:从尾到头打印链表

题目1511:从尾到头打印链表 题解报告:方法一.链表创建,头插法,方法二.运用栈,注意栈可能溢出~! #include <iostream> #include <stack> #include <cstdio> using namespace std; // stack int main() { int num; stack<int> List; while(scanf("%d", &num) && num !=