단 방향 링크 의 마지막 n 번 째 노드 삭제
struct SNode { int value; SNode *next; }; SNode rdel(SNode *head, int n);
1. 제목 을 leetcode 로 바 꾸 면 다음 과 같다.
링크 를 지정 하고 링크 의 마지막 n 번 째 노드 를 삭제 하 며 링크 의 머리 노드 를 되 돌려 줍 니 다.
본보기 링크 1 - > 2 - > 3 - > 4 - > 5 - > null 과 n = 2 를 드 립 니 다.
마지막 두 번 째 노드 를 삭제 하면 이 링크 는 1 - > 2 - > 3 - > 5 - > null 이 됩 니 다.
1) n 이 링크 길이 보다 큰 지 여 부 를 고려 하지 않 는 다.
생각:
두 바늘 을 정의 합 니 다. 처음에 이 두 바늘 의 next 지향 점 을 정의 한 다음 에 한 바늘 로 n 보 를 먼저 가게 한 다음 에 두 바늘 로 체인 시 계 를 동시에 옮 겨 다 녔 습 니 다. 첫 번 째 바늘 이 링크 의 끝 에 도 착 했 을 때 두 번 째 지침 은 삭제 할 마지막 n + 1 개의 매듭 점 을 가리 키 는 것 입 니 다.
ListNode *rdel(ListNode* head, int n)
{
ListNode l(0);
ListNode *pre = &l;
pre->next = head;
ListNode *p = pre;
ListNode *q = pre;
for(int i = 0; i < n; i++)
{
p = p->next;
}
while(p->next != NULL)
{
p = p->next;
q = q->next;
}
ListNode *k = q->next;//k
if(k == head)
{
head = head->next;
return head;
}
q->next = k->next;
return head;
}
2) n 의 여러 가지 가능 한 상황 을 고려 할 때
생각:
두 개의 지침 을 정의 합 니 다. 처음에 각각 머리 결점 을 가리 키 고 한 개의 지침 을 n - 1 단계 먼저 가게 합 니 다. 이 어 두 개의 지침 이 동시에 링크 를 옮 겨 다 녔 습 니 다. 첫 번 째 지침 이 링크 의 끝 에 도 착 했 을 때 두 번 째 지침 은 삭제 할 마지막 n 번 째 결점 을 가리 키 는 것 입 니 다. 프로 그래 밍 에 주의해 야 할 것 은:
입력 한 링크 가 비어 있 거나 입력 한 n 이 합 법 적 이지 않 습 니 다.입력 한 n 은 링크 의 길이 보다 큽 니 다.삭제 해 야 할 노드 의 이전 노드 를 저장 해 야 합 니 다.삭 제 된 그 결점 은 두 결점 이다.
ListNode* removeNthFromEnd(ListNode* pHead, int n)
{
ListNode* pFast = pHead;
ListNode* pLow = pHead;
ListNode* pPre = NULL;
if (pHead == NULL || n <=0)
{
return NULL;// n
}
for (int i = 0; i < n-1; i++)
{
if(pFast->next != NULL)
{
pFast = pFast->next;
}
else
{
return NULL;// n
}
}
while(pFast->next != NULL)
{
pFast = pFast->next;
pPre = pLow;//
pLow = pLow->next;
}
// pLow
if (pLow == pHead)//
{
pHead = pHead->next;
}
else
{
pPre->next = pPre->next->next;//
}
return pHead;
}
테스트 코드:
struct ListNode
{
ListNode(int x ): val(x), next(NULL){}
int val;
ListNode* next;
};
void BianLi(ListNode* pHead)
{
ListNode* pCur = pHead;
while(pCur!=NULL)
{
cout<val<next;
}
}
void main()
{
ListNode l1(1);
ListNode l2(2);
ListNode l3(3);
ListNode l4(4);
ListNode l5(5);
ListNode l6(6);
l1.next = &l2;
l2.next = &l3;
l3.next = &l4;
l4.next = &l5;
l5.next = &l6;
l6.next = NULL;
ListNode* pHead = &l1;
BianLi(pHead);
pHead = removeNthFromEnd(pHead, 2);
cout<
결론: 만약 에 바늘 하 나 를 n 단계 로 먼저 가게 한다 면 첫 번 째 바늘 이 체인 테이블 의 끝 에 도 착 했 을 때 두 번 째 바늘 은 삭제 할 마지막 n + 1 개의 결점 을 가리킨다.
그리고 만약 에 바늘 하 나 를 먼저 n - 1 단계 로 가게 한다 면 첫 번 째 바늘 이 링크 의 끝 에 도 착 했 을 때 두 번 째 바늘 은 삭제 해 야 할 마지막 n 번 째 결점 을 가리 키 는 것 이다.
프로그램의 건장 성 을 위해 서 는 다음 과 같은 고려 가 필요 하 다.
1) 입력 한 링크 가 비어 있 거나 입력 한 n 이 합 법 적 이지 않 습 니 다. 2) 입력 한 n 은 링크 의 길이 보다 크다. 3) 삭제 해 야 할 결점 의 이전 결점 을 저장 해 야 한다. 4) 삭 제 된 그 결점 은 두 결점 이다.
참고:https://blog.csdn.net/u013108511/article/details/80404476 C + + 링크 조작 1: 마지막 n 번 째 노드 삭제
https://blog.csdn.net/zwhlxl/article/details/47104535 [면접 문제] 링크 의 마지막 n 번 째 노드 를 삭제 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
00002 필기시험 문제 (JAVA)1. JAVA 에서 아래 () 인 터 페 이 스 는 키 쌍 으로 대상 을 저장 합 니 다.A. java. B. PrintWriter 를 사용 하면 대상 을 전송 할 수 있 습 니 다. C. ObjectOutputSt...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.