[Java] 找出链表中倒数第k个节点

某公司的专业一面面试题

默默地用Java写:

1.大致的数据结构:

class Node{
   Node(int value, Node nnode){
      this.value=value;
      this.nnode=nnode;
   }
}
2.找到倒数第k个节点的函数findknode()

public static Node findknode(Node head, int k){
  if ((Null==head) || (Null==head.nnode))
      return head;
  cur=head;
  knode=head;
  nextnode=Null;
  count=0;
  while(cur!=Null){
     count+=1;
     if(count>=k){
         nextnode=knode.nnode;
         knode=nextnode;
      }
     nextnode=cur.nnode;
     cur=nextnode;
  }
  return knode;
}

实际上就是快慢指针的思想,对于链表实际长度小于k的情况,默认返回头节点head。


欢迎指正~

<think>好的,用户想要获取关于数据结构中链表的常见面试题目及答案。我需要先回顾一下已有的引用内容,看看里面有没有相关的信息。引用1提到了单链表的常见面试题,比如求有效节点个数、查找倒数第k个节点、反转链表、逆序打印等。引用2也有关于链表的回文结构判断问题。引用3是关于字符串的,可能不太相关。 首先,我需要整理引用1中的题目,并补充其他常见的链表题目。比如,链表中环的检测、合并有序链表、删除倒数第N个节点、两个链表的交点等。这些题目都是常见的面试题,用户可能感兴趣。 接下来,每个问题需要给出思路和答案。要确保使用中文,并且代码部分正确。比如反转链表可以用迭代或递归的方法,引用1中的Python代码示例可能需要调整成更通用的解法。另外,引用2中的回文链表问题,要求O(n)时间和O(1)空间,这需要快慢指针找到中点,然后反转后半部分进行比较。 同时,用户要求生成相关问题,可能需要将每个题目作为相关问题列出。但根据用户之前的示例,相关问题放在最后,所以可能需要先回答问题,再列出相关问题。 要注意引用标识的正确添加,例如在反转链表的部分,引用1提到了腾讯的题目,所以应该在对应的位置添加[^1]。回文链表的问题来自引用2,需要添加[^2]。 还需要检查是否有其他常见问题没有被引用覆盖,比如合并两个有序链表、检测环等,这些可能需要自己补充,但确保答案正确。 最后,代码部分需要用正确的格式,使用反引号包裹,并标明语言。比如Python或Java,但根据引用中的例子,用户可能接受Python代码。 总结步骤: 1. 列出引用中的链表题目,并补充其他常见问题。 2. 为每个问题编写思路和解答,包括代码示例。 3. 正确添加引用标识。 4. 生成相关问题列表放在最后。</think>### 数据结构中链表的常见面试题及答案 #### 1. 求单链表中有效节点的个数 **思路**:遍历链表,统计节点数量。 **示例代码(Python)**: ```python def count_nodes(head): count = 0 current = head while current: count += 1 current = current.next return count ``` **引用**:单链表有效节点计数是基础操作,常用于后续复杂问题。 --- #### 2. 查找链表倒数第k个节点 **思路**:双指针法。快指针先走$k$步,然后快慢指针同步移动,快指针到末尾时慢指针指向目标节点。 **示例代码(Python)**: ```python def find_kth_from_end(head, k): fast = slow = head for _ in range(k): if not fast: return None # 链表长度不足k fast = fast.next while fast: fast = fast.next slow = slow.next return slow ``` **引用**:该方法是解决倒数节点问题的经典双指针技巧。 --- #### 3. 单链表的反转 **思路**:迭代法。维护三个指针(前驱、当前、后继),逐步反转指向。 **示例代码(Python)**: ```python def reverse_list(head): prev = None current = head while current: next_node = current.next current.next = prev prev = current current = next_node return prev ``` **引用**:链表反转是腾讯等公司高频考点。 --- #### 4. 从尾到头打印单链表 **思路**:利用栈的后进先出特性,或递归回溯时输出。 **示例代码(栈实现,Python)**: ```python def print_reverse(head): stack = [] current = head while current: stack.append(current.val) current = current.next while stack: print(stack.pop()) ``` **引用**:栈是逆序输出的典型解决方案。 --- #### 5. 判断链表是否为回文结构 **思路**:快慢指针找中点,反转后半部分链表,再比较前后两半是否一致。 **示例代码(Python)**: ```python def is_palindrome(head): # 找中点 slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next # 反转后半部分 prev = None while slow: next_node = slow.next slow.next = prev prev = slow slow = next_node # 比较前后两半 left, right = head, prev while right: if left.val != right.val: return False left = left.next right = right.next return True ``` **引用**:该方法满足$O(n)$时间复杂度和$O(1)$空间复杂度[^2]。 --- #### 6. 合并两个有序链表 **思路**:递归或迭代比较节点值,按升序连接。 **示例代码(迭代法,Python)**: ```python def merge_two_lists(l1, l2): dummy = ListNode(-1) current = dummy while l1 and l2: if l1.val < l2.val: current.next = l1 l1 = l1.next else: current.next = l2 l2 = l2.next current = current.next current.next = l1 if l1 else l2 return dummy.next ``` --- #### 7. 链表中环的检测 **思路**:快慢指针法。若快慢指针相遇,则存在环。 **示例代码(Python)**: ```python def has_cycle(head): slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next if slow == fast: return True return False ``` --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值