LeetCode算法题–删除链表的倒数第N个节点
- 题目来源:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/submissions/
题目要求
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例1:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
题目思路:
两次迭代链表。第一次迭代,弄清楚链表的长度,即一共有几个节点。
题目给定的N为倒数第N个节点,此时用长度 - N + 1,得到的数即为对应正数第n个节点。此时进行第二次迭代,从head节点开始迭代, 每迭代一次,长度 - n + 1 对应的大小为Length,length递减,指针依次后移。迭代完毕后,指针就指向要删除节点的前一个节点了,此时就很容易删除了。
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode endNode = new ListNode(0);
ListNode followNode = head;
endNode.next = head;
int length = 0;
while(followNode != null){
length++;
followNode = followNode.next;
}
followNode = endNode;
length -= n;
while(length > 0){
followNode = followNode.next;
length--;
}
followNode.next = followNode.next.next;
return endNode.next;
}
}
执行结果:
时间复杂度:O(n),n为链表长度。