删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
一种方法是先计算链表的长度N,然后定位到第(N-n)个节点,删除节点(N-n+1)也即(倒数第n个节点)
代码如下:
public static ListNode removeNthFromEnd(ListNode head, int n) { // 新建一个节点temp // temp.next = head可以保存链表的头结点 // 也方便处理删除的是第一个节点(倒数第N个) ListNode temp = new ListNode(0); temp.next = head; int N = 0; // Get the length of the list while (head != null) { N++; head = head.next; } N = N-n; head = temp; // Locate the (N-n)th node while (N>0) { head = head.next; N--; } head.next = head.next.next; return temp.next; }
第二种方法是,使用两个指针,首先将第一个指针置于第二个的后n+1个节点处。再同时移动两个指针,当第一个指向链表末尾时,第二个指针指向第(N-n)个节点。
以n=2为例,即删除倒数第二个节点
指针2指向开始处,指针1与指针2相隔为(n+1)
同时移动指针1与2,当1指向null时,二指向倒数第(n+1)个节点。
代码如下:
public static ListNode test(ListNode head, int n) { ListNode temp = new ListNode(0); temp.next = head; ListNode p = temp; ListNode q = temp; while (n+1>0) { q = q.next; n--; } while (q != null) { p = p.next; q = q.next; } p.next = p.next.next; return temp.next; }
posted on 2018-04-25 21:21 Deltadeblog 阅读(255) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步