删除单链表倒数第n个节点
2016-10-12 21:28
429 查看
基本问题
如何删除单链表中的倒数第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; }
一次遍历法
使用快慢指针。快指针比慢指针提前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; }
相关文章推荐
- leetcode_19. Remove Nth Node From End of List 删除单链表中的倒数第n个节点,双指针法
- Chapter 2 | Linked Lists--返回单链表倒数第n个元素及删除中间的某个节点
- 删除单链表的倒数第N个节点
- 删除单链表中的倒数第n个节点的实现及测试程序
- 删除单链表倒数第n个节点
- 删除链表中倒数第n个节点
- 寻找单链表的倒数第N个节点
- 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。
- 移除单链表的倒数第N个节点
- LintCode 删除链表中倒数第n个节点
- 【经典面试题】寻找单链表倒数第n个节点_C/C++
- 在单链表和双链表中删除倒数第k个节点
- Lintcode 174.删除链表中倒数第n个节点
- 删除链表中倒数第n个节点
- LeetCode 从链表中删除倒数第N个节点
- LintCode Remove Nth Node From End of List 删除链表中倒数第n个节点
- [LeetCode]—Remove Nth Node From End of List 删除链表的倒数第n个节点
- 给定单链表的头结点,如何快速的找到倒数的第n个节点?
- 删除单链表倒数第K个节点
- lintcode ----删除链表中倒数第n个节点