自己原来想到了双指针法,后来看了下网上的解答,证明是对的。
我觉得双指针法实际上算是两次pass, 看网上解答是说算一次,没搞明白
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.
分析:
1. list 是否为空
2. 双指针法,fast 走快一点
(1). 如果 k = len, 修改head = head.next
(2). 循环,一直到fast到最后
3. 综合考虑
总结:
其实还可以考虑在最前面新加一个node, 把第2步的两个综合起来
考虑最开始的时候,可以使用增加新的点来处理,会比较简单一些。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# @return a ListNode
def removeNthFromEnd(self, head, n):
if head==None:
return head
fast,slow = head,head
for dummy_i in range(n):
fast = fast.next
if fast==None:
return head.next
else:
while True:
if fast.next==None:
slow.next = slow.next.next
return head
else:
fast,slow = fast.next,slow.next
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
if (head==NULL){
return head;
}
ListNode *fast = head;
ListNode *slow = head;
for(int i=1;i<=n;i++){
fast = fast->next;
}
if (fast==NULL){
return head->next;
}else{
while (true){
if (fast->next==NULL){
slow->next = slow->next->next;
return head;
}else{
fast = fast->next;
slow = slow->next;
}
}
}
}
};
总结:
1. for(int i=1;i<=n;i++){} 如果i 是新建的,前面要加int