링크 상용 조작 및 면접 문제
여기에 링크 의 생 성 을 적 었 습 니 다. 비교적 기본 적 입 니 다!그 다음 에 링크 의 요 소 를 삭제 하려 면 첫 번 째 요소 가 삭제 되 었 는 지 고려 해 야 합 니 다.그 다음 에 링크 의 마지막 k 번 째 요 소 를 찾 습 니 다. 두 개의 지침 을 사용 할 수 있 습 니 다. 한 개의 지침 을 사용 한 후에 k 번 을 옮 긴 다음 에 두 개 는 동시에 뒤로 갑 니 다. 먼저 k 번 을 걸 어서 끝까지 갈 때 다른 하 나 는 마지막 k 번 째 요소 에 이 르 렀 습 니 다. 두 지침 의 위 치 는 k 의 차이 가 있 기 때 문 입 니 다.마지막 으로 체인 시 계 를 반전 시 키 고 뒤로 가면 서 체인 시계의 바늘 을 앞의 요 소 를 가리 키 면 됩 니 다.
Notice: 1: 링크 는 노드 를 만 들 고 삭제 할 때 만 메모 리 를 분배 해 야 합 니 다. 즉, 메모 리 를 조작 할 때 필요 합 니 다. 이것 은 링크 분배 메모리 블록 이 연속 적 이지 않 고 분 산 된 것 입 니 다. 즉, 한 노드 의 한 노드 의 분배 이기 때문에 메모리 분배 함 수 를 호출 해 야 합 니 다.메모리 할당 함수 가 자주 사용 하 는 것 은 두 개의 C + + 중의 new 와 C 언어 중의 malloc 입 니 다. 이것 도 면접 에서 자주 묻 는 것 입 니 다. 즉, 그 차이 입 니 다.호출 방법 은 간단 하지만,
ListNode *node = new ListNode();
ListNode *node = (ListNode *)malloc(sizeof(ListNode));
물론 메모리 방출 을 잊 지 마 세 요. 해당 하 는 delete 와 free 는 다음 과 같 습 니 다.
delete node;
free(node);
그들 두 사람 은 어떤 차이 가 있 습 니까?1: now 지정 한 형식의 지침 을 되 돌려 줍 니 다. 할당 할 메모리 의 크기 를 자동 으로 계산 할 수 있 습 니 다.malloc 는 실제 유형 으로 강제로 전환 하고 크기 는 우리 가 줘 야 한다.2: malloc 는 메모리 만 분배 하고 그 값 을 초기 화하 지 않 습 니 다. 즉, 값 은 무 작위 이 고 new 는 초기 화 할 수 있 습 니 다.
일부 연습 코드:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
struct ListNode
{
int val;
ListNode * next;
};
ListNode* creat(int n) //
{
ListNode *head = new ListNode(), *p = new ListNode();
// head = p = (ListNode *)malloc(sizeof(ListNode));
scanf("%d",&p->val);
p->next = NULL;
head = p;
for(int i=1;i<n;i++)
{
ListNode *tmp = new ListNode();
//tmp = (ListNode* )malloc(sizeof(ListNode));
scanf("%d",&tmp->val);
tmp->next = NULL;
p->next = tmp;
p = p->next; ///notice:
}
return head;
}
void print(ListNode *head) ///
{
while(head!=NULL){
printf("%d ",head->val);
head = head->next;
}
puts("");
}
ListNode* RemoveNode(ListNode *head,int num)
{
ListNode *newhead = NULL; //
newhead = head; ///head newhead tmp
if(newhead->val == num){ ///
head = head->next;
return head;
}
ListNode *tmp = NULL;
tmp = head; //
while(newhead!=NULL) //
{
if(newhead->val == num){
tmp->next = tmp -> next -> next;
//delete tmp;
return head;
}
tmp = newhead;
newhead = newhead->next;
}
}
void Find_KthNode(ListNode *head,int k) /// k
{
ListNode *one = NULL,*two = NULL;
one = head,two = head;
while(one!=NULL && k--)
{
one = one->next;
}
while(one!=NULL)
{
one = one->next;
two = two->next;
}
printf("Find last %dth secessful
");
printf("%d
",two->val);
}
ListNode* ReverseList(ListNode *head)
{
ListNode *p = head;
ListNode *pre = NULL;
while(p!=NULL)
{
ListNode *tmp = p->next;
if(tmp==NULL)
head = p;
p->next = pre;
pre = p;
p = tmp; ///Notice : p = p->next
}
return head;
}
int main()
{
//freopen("Input.txt","r",stdin);
int n;
while(~scanf("%d",&n))
{
ListNode *head = creat(n);
puts("Creat secessful");
print(head);
int num;
scanf("%d",&num);
head = RemoveNode(head,num);
puts("ReMove secessful");
print(head);
scanf("%d",&num);
Find_KthNode(head,num);
head = ReverseList(head);
//printf("HEAD->%d
",head->val);
print(head);
}
return 0;
}
/***** 10 1 2 3 4 5 6 7 8 9 10 10 3 ******/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
하나의 단일 체인 테이블의 순환과 귀속 실현을 반전시키다텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.