: 타이틀
리스트, n은 노드의 삭제 목록 상호을 감안할 때,와 헤드 노드리스트로 돌아갑니다.
예 :
1-> 2-> 3-> 4 -> 5이고, n = 2 : 목록이 제공
끝에서 두 번째 노드리스트 1-> 2-> 3-> 5가 될 때 제거 후.
설명 : 주어진 n이 유효한지 확인합니다.
고급 : 하나 개를 사용 패스 실현
: 해석
리스트의 길이가 다시 목록을 가져 끝에서 두 번째 n 개의 노드를 삭제하는 최초의 이송에 삭제 한 양의 첫번째 렌-N + 1 개 노드 삭제 :
/**
* 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) {
int len=0;
ListNode temp=new ListNode();
temp=head;
while(temp!=null){
temp=temp.next;
len++;
}
temp=head;
if(len==n) return head.next;//如果删除的是首元素则直接返回第二元素
for(int i=0;i<len-n-1;i++){
temp=temp.next;
}
temp.next=temp.next.next;
return head;
}
}
아니면 삭제할 요소를 찾기 위해 이중 포인터 탐색 방법을 사용할 수 있습니다. 첫 번째 단계는 포인터 N + 1을 시작 포인터로부터 제리스트의 선두의 목록의 시작으로부터 전방으로 이동된다. 이제이 두 포인터 n 개의 노드로 구분됩니다. 제 포인터 마지막 노드에 도달 할 때까지 동시에 순방향 양손 이동에 의해 유지되는 일정한 간격을 보자. 이 때, 제 n 번째 노드 포인터 포인트는 마지막 접속점부터. 우리는이 노드의 다음 노드에 다음 포인터에 포인터가 참조하는 두 번째 노드 - 링크를 다시.
/**
* 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) {
int len=0;
ListNode temp1=new ListNode(0);
ListNode temp2=new ListNode(0);
temp1=head;
temp2=head;
while(len!=n){
temp1=temp1.next;
len++;
}
if(temp1==null) return head.next;
while(temp1.next!=null){
temp1=temp1.next;
temp2=temp2.next;
}
temp2.next=temp2.next.next;
return head;
}
}
사실, (예를 들면 하나 개의 노드 만 삭제되는 최초의 노드로) 간섭 특별한 상황을 줄이기 위해, 우리는 다음 노드가 헤드 노드 지원, 바보 노드이기 때문에, 더미를 사용하는 공식 특정 아이디어 솔루션을 볼 수 있습니다
포털