数据结构之单链表(二)面试题
这是一道腾讯的关于单链表的面试题:
单链表的反转
- 第一种解法
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()); }