数据结构之单链表(二)面试题

194 阅读1分钟

数据结构之单链表(二)面试题

这是一道腾讯的关于单链表的面试题:

单链表的反转

  • 第一种解法
SingleLinkedListNode prev = head.next;
SingleLinkedListNode pCur = prev.next;

while (prev.next != null) {
    prev.next = pCur.next;
    pCur.next = head.next;
    head.next = pCur;
    pCur = prev.next;
}

pCur是要操作的节点,prev是其前置节点,初始为prev为第一个有效节点,pCur为第二个有效节点

每次操作的关键在于将前置节点prev指向其后置节点,操作节点指向头结点的后置节点,头结点指向要操作的节点,如图所示

在这里插入图片描述

  • 第二种解法
SingleLinkedListNode cur = head.next;
SingleLinkedListNode next = null;
SingleLinkedListNode revHead = new SingleLinkedListNode(0,"");

while (cur != null){
    next = cur.next;
    cur.next = revHead.next;
    revHead.next = cur;
    cur = next;
}

head.next = revHead.next;

cur是要操作的节点,关键在于新建一个头结点,将原链表的每一个节点一次插入到这个新建头结点之后。

先用next暂时保存cur的下个节点,然后将cur指向新建头结点的后置节点,将新建头结点的后置指向当前操作节点,然后将操作节点指向下一个节点,如此循环。最后将原链表的头结点指向新建头结点的后置节点即可。 在这里插入图片描述

逆序打印单链表

这是一道百度的关于单链表的面试题

  • 第一种解法

    根据上面的方法先反转再打印,不过这个方法会破坏原链表结构

  • 第二种解法

    利用栈

    Stack<SingleLinkedListNode> singleLinkedListNodeStack = new Stack<>();
    SingleLinkedListNode temp = head.next;
    
    while (temp != null){
        singleLinkedListNodeStack.push(temp);
        temp = temp.next;
    }
    
    while (singleLinkedListNodeStack.size() > 0){
        System.out.println(singleLinkedListNodeStack.pop());
    }