数据结构与算法-单项链表-练习2(反转链表和从尾到头打印链表)

题目一:单链表的反转 题目二:从尾到头打印链表

一、单链表的反转

思路:将原始链表节点按顺序依次取出来,每次取出来的节点放在新链表的头结点与头结点的后一个节点之间。

代码如下(示例):

    public void reverse(HeroNode heroNode) {
    
    
        //如果没有节点或者只有一个节点 不需要反转
        if (head.next==null||head.next.next==null){
    
    
            return;
        }
        //多于一个节点的情况,按顺序取出一个节点放在新链表的最前面(这里跟插入节点到链表的思想是一样的)
        HeroNode temp = head.next;
        HeroNode reverseHode = new HeroNode(0,"","");
        HeroNode next = null;
        while(temp!=null){
    
    
            next = temp.next; //暂时保存当前节点的下一个节点
            temp.next= reverseHode.next; //取出节点 将取出节点与reverseHode的下一个节点相连接
            reverseHode.next = temp;  //将取出的节点与reverseHode相连接
            temp = next; //遍历整个链表
        }
        head.next= reverseHode.next;  //将head.next指向reverse.next,实现单链表的反转
    }

注意事项:1、这里思路类似于插入节点!画个图就明白了。
2、其中while的下一句,一定要用next来保存temp.next这个节点。否则在新链表中只插入一个节点,然后就会报出空指针异常的错误。因为temp.next= reverseHode.next这句话已经将temp.next指向新链表头结点的下一个节点,而下一个节点是空的(新链表刚开始为空)。可以debug体会一下。
3、temp.next= reverseHode.next是指(指向的作用)。

2.从尾到头打印链表

代码如下(示例):

public void reversePrint(HeroNode head) {
    
    
        //如果单链表为空,则无需打印
        if (head.next == null) {
    
    
            return;
        }
        Stack<HeroNode> stack = new Stack<>();
        HeroNode temp = head.next;
        //依次将单链表中的节点压入栈中
        while (temp != null) {
    
    
            stack.push(temp);
            temp = temp.next;
        }
        //依次出栈
        while (stack.size() > 0) {
    
    
            System.out.println(stack.pop());
        }
    }

利用栈(先进后出)的思路完成就行


总结

第一道有点难想,画图出来,类似于插入节点的思想,很巧妙~

猜你喜欢

转载自blog.csdn.net/slighting1128/article/details/111168868