删除单链表倒数第n个节点
2016-11-04 20:03
435 查看
基本问题
如何删除单链表中的倒数第n个节点?常规解法
先遍历一遍单链表,计算出单链表的长度,然后,从单链表头部删除指定的节点。代码实现
/**
*
*Description: 删除单链表倒数第n个节点,常规解法.
*
*@param head
*@param n
*@return ListNode
*/
public static ListNode removeNthFromEnd(ListNode head, int n) {
if (head == null)
return null;
//get length of list
ListNode p = head;
int len = 0;
while (p != null) {
len++;
p = p.next;
}
//if remove first node
int fromStart = len - n + 1;
if (fromStart == 1)
return head.next;
//remove non-first node
p = head;
int i = 0;
while (p != null) {
i++;
if (i == fromStart - 1) {
p.next = p.next.next;
}
p = p.next;
}
return head;
}
[/code]
一次遍历法
使用快慢指针。快指针比慢指针提前n个单元。当快指针到达单链表尾部时,慢指针指向待删除节点的前节点。代码实现
/**
*
*Description: 删除单链表倒数第n个节点,快慢指针法.
*
*@param head
*@param n
*@return ListNode
*/
public static ListNode removeNthFromEnd(ListNode head, int n) {
if (head == null)
return null;
ListNode fast = head;
ListNode slow = head;
for (int i = 0; i < n; i++) {
fast = fast.next;
}
//if remove the first node
if (fast == null) {
head = head.next;
return head;
}
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return head;
}
[/code]
来自为知笔记(Wiz)
相关文章推荐
- 删除单链表中的倒数第n个节点的实现及测试程序
- Chapter 2 | Linked Lists--返回单链表倒数第n个元素及删除中间的某个节点
- 删除单链表的倒数第N个节点
- 删除单链表倒数第n个节点
- leetcode_19. Remove Nth Node From End of List 删除单链表中的倒数第n个节点,双指针法
- leetcode-19. Remove Nth Node From End of List(删除链表倒数第N个节点)
- (算法)输出单链表的倒数第k个节点,删除特点的节点和从链表尾一次输出节点值
- LeetCode算法练习(删除链表的倒数第N个节点)
- 删除链表中倒数第n个节点
- 删除链表中倒数第n个节点
- lintcode 174 删除链表中倒数第n个节点
- 查找单链表的倒数第N个节点
- 容易 删除链表中倒数第n个节点
- 删除链表中倒数第n个节点
- 【经典面试题】寻找单链表倒数第n个节点
- 删除链表中倒数第n个节点(LintCode)
- 单链表的逆序和倒数第n个节点
- Lintcode174——删除链表中倒数第n个节点
- python_lintcode_372在O(1)时间复杂度删除链表节点_174删除链表中倒数第n个节点
- 题目:删除链表中倒数第n个节点