java编写删除链表倒数第n个结点的元素
时间: 2023-11-22 12:05:08 浏览: 86
删除链表倒数第n个结点的元素,可以采用双指针的方法。
1. 定义两个指针 p 和 q,初始都指向头结点。
2. 将 q 向后移动 n 个结点。
3. 当 q 到达链表末尾时,p 恰好指向要删除的结点的前一个结点。
4. 删除 p 的下一个结点即可。
下面是 Java 代码实现:
```java
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode p = head;
ListNode q = head;
for (int i = 0; i < n; i++) {
q = q.next;
}
if (q == null) { // 删除头结点的情况
return head.next;
}
while (q.next != null) {
p = p.next;
q = q.next;
}
p.next = p.next.next;
return head;
}
```
注意:需要考虑删除头结点的情况。如果 q 到达链表末尾时,p 恰好指向头结点,需要返回 head.next。
相关问题
有一个单链表l(至少有1个结点),其头结点指针为head,\n\n编写一个过程将l逆置,即最后一个结点变成第一个结点,\n\n原来倒数第二个结点变成第二个结点,如此等等。java
在Java中,可以使用迭代或者递归的方式反转单链表。这里我会提供一种常见的迭代方法:
```java
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public void reverseList(ListNode head) {
// 创建两个指针,一个指向当前节点,另一个指向前一个节点
ListNode prev = null, curr = head;
// 当前节点不为空时,循环遍历整个链表
while (curr != null) {
// 将当前节点的next指向前一个节点
ListNode temp = curr.next;
curr.next = prev; // 更新当前节点的next
// 移动指针到下一个节点
prev = curr;
curr = temp;
}
// 链表反转完成,返回新的头节点prev
head = prev;
}
```
在这个过程中,我们通过不断交换`curr.next`和`prev`的值,使得每次循环后`curr`都会向后移动一位,并且`prev`会成为`curr`的下一个节点。当`curr`变为`null`时,说明已经遍历到了链表的末尾,此时`prev`就是新链表的头节点。
给我二十道Java算法题目
好的,以下是二十道Java算法题目:
1. 编写一个程序,将字符串中的字符按照出现次数进行排序。
2. 给定一个整数数组,找到两个数之和等于目标值的数对。
3. 实现一个函数来计算一个字符串中含有的不重复字符的个数。
4. 给定一个字符串,编写一个函数来判断它是否是回文字符串。
5. 实现一个函数,把一个字符串中的空格替换成%20。
6. 给定一个二叉树,编写一个函数来获取其最大深度。
7. 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。
8. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
9. 给定一个无序数组,找出其中的最长连续序列。
10. 给定一个二叉树,确定它是否是一个有效的二叉搜索树。
11. 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
12. 编写一个函数来验证输入的字符串是否是有效的 IPv4 地址或 IPv6 地址。
13. 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
14. 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
15. 编写一个程序,找到两个单链表相交的起始节点。
16. 给定一个二叉树,返回所有从根节点到叶子节点的路径。
17. 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
18. 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
19. 给定一个字符串 s,找到 s 中最长的回文子串。
20. 给定一个二叉树,找到它的最小深度。
希望这些题目能够对您有所帮助!
阅读全文