单链表的面试算法题[更新中...]

1. 新浪面试:请设计一个单链表,给定头结点和整数k,返回单链表倒数第k个结点。

代码[Java实现]:

/**
 * 返回单链表倒数第k个结点: [新浪面试题 & 剑指Offer.22]
 *    思路:1. 接收头结点和k值
 *         2. 整体遍历,得到链表长度
 *         3. 再次遍历,返回(len-k)个值即为倒数第k个结点
 * @author KyleHsu
 */
public Node lastKNode(Node head,int k){
  // 没有结点,没有找到
  if (head.next == null){
    return null;
  }
  int len = SinglelinkedlistTest.getLen(head);
  // 如果给的k不在链表长度范围内,肯定找不到
  if (k<=0 || k>len){
    return null;
  }
  Node temp = head.next;
  for (int i = 0; i < (len-k); i++) {
    temp = temp.next;
  }
  return temp;
}
/**
 * 返回单链表的有效节点个数
 * @author KyleHsu
 */
public static int getLen(Node head){
  if (head.next == null){
    return 0;
  }
  int length = 0;
  Node temp = head.next;
  while (temp != null){
    temp = temp.next;
    length++;
  }
  return length;
}

2. 腾讯面试:请设计一个单链表,给定头结点,将其反转。

image

/**
   *  反转一个单链表: [腾讯面试题 & 剑指Offer.24]:
   *      思路1:头插法:实际上只是用了一个辅助temp指针和一个新的头结点把原来的单链表进行了反转,并没有制造新的链表
   *      思路2:使用栈的特性 - 后进先出
   *      思路3:递归反转
   */
    public static void reverseLinkedlist(Node head){
      // 考虑意外情况
      if (head.next == null){
        throw new RuntimeException("当前链表为空,无需进行反转~~");
      }
      if (head.next.next == null){
        throw new RuntimeException("当前链表仅有一个结点,无需进项反转~~");
      }
      /**
       * 使用头插法进行反转:
       *      1.创建一个新的头结点,用于临时连接新的结点
       *      2.创建一个辅助结点,用于指向原链表的第一个结点,逐个去除原链表的结点,然后连接到新链表头结点的第一个
       *
       *      next = cur.next;//先暂时保存当前节点的下一个节点,因为后面需要使用
       * 			cur.next = reverseHead.next;//将cur的下一个节点指向新的链表的最前端
       * 			reverseHead.next = cur; //将cur 连接到新的链表上
       * 			cur = next;//让cur后移
       */
      Node newHead = new Node(0,"","");
      Node temp = head.next;
      Node tempNext = null;
      // 只要原链表中还有结点就一直往后找
      while (temp != null){
        tempNext = temp.next; // 先保存第一个结点的后一根线
        temp.next = newHead.next; //抛弃第一个结点的前一根线
        newHead.next = temp;  //再接上第一个结点的前一根线
        temp = tempNext; // 接上第一个结点的后一根线
      }
      // 接上头结点
      head.next = newHead.next;
    }

3. 百度面试:请设计一个单链表,给定头结点,将其逆序打印。

image

  /**
   * 逆序打印单链表:[百度面试题]:
   *    方式一:利用刚才反转的单链表,然后直接遍历即可。但是由于反转了原来的单链表会破坏掉链表的结构,所以不推荐!
   *    方式二:利用栈的特点 - 后进先出
   *
   *    其实本题思路和腾讯面试题相同,只是换了栈的方式实现而已
   *
   */
  public static void reversePrint(Node head){
    // 考虑意外情况
    if (head.next == null){
      throw new RuntimeException("当前链表为空,无需进行反转~~");
    }
    Stack<Node> nodes = new Stack<>();
    Node temp = head.next;
    while (temp != null){
      // 压栈
      nodes.push(temp);
      temp = temp.next;
    }
    while (nodes.size() > 0){
      System.out.println(nodes.pop());
    }
  }
posted @ 2021-08-06 17:23  KyleHsu  阅读(76)  评论(0)    收藏  举报