题目:
Given a linked list, remove the nth node from the end of list and return its head.
For example,
Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Try to do this in one pass.
题意:
给一个链表,去掉从后面数第n个结点,并且返回链表的首结点。
要求:给定的n一定为有效合法的值,并且尽量一步达到要求。
常规思路是先计算链表的长度len,之后计算正序idx = len-n,然后进行删除结点算法,代码如下:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int len = 0;
for (ListNode node = head; node != null; len++, node = node.next);
int idx = len - n;
if (idx == 0) {
head = head.next;
}
else {
ListNode node = head;
while (idx>1) {
node = node.next;
idx --;
}
node.next = node.next.next;
}
return head;
}
}
网上大佬的思路一般是定义两个结点指针a,b,之后让b先跑n步,之后a和b同步进行,跑到b.next == null时,对a.next进行删除操作,代码如下:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode a, b;
a = b = head;
while (n-- > 0) {
b = b.next;
}
if (b == null) {
return head.next;
}
b = b.next;
while (b != null) {
a = a.next;
b = b.next;
}
a.next = a.next.next;
return head;
}
}