在这里,我尝试对给定链接列表的子列表进行反向处理的非递归解决方案,因为我们获得了链接列表以及位置m和n。我们需要将链表从位置m反转到n,但这会导致分段错误 下面给出了我的代码,其中反向功能有一些分段错误...
// C program to reverse a linked list
// from position m to position n
#include <stdio.h>
#include <stdlib.h>
// Linked list node
struct ListNode {
int data;
struct ListNode* next;
};
ListNode* reverseBetween(ListNode* A, int B, int C) {
ListNode *p=A,*q=A,*cur,*pre,*nex;
int i=1,j=1;
if(C-B==0)
return A;
if(B!=1)
{
while(i!=B-1)
{
p=p->next;
i++;
}}
while(j!=C)
{
q=q->next;
j++;
}
if(B==1)
{
cur=A;
A=q;
}
// p->next->next=q->next->next
// p->next=q->next;
else{
cur=p->next;
p->next=q;
}
nex=cur->next;
cur->next=q->next;
while(nex!=q->next||q!=cur){
p=cur;
cur=nex;
nex=cur->next;
cur->next=p;}
return A;
}
void print(struct ListNode* A)
{
while (A != NULL) {
printf("%d ", A->data);
A = A->next;
}
printf("\n");
}
// function to add a new node at the
// begining of the list
void push(struct ListNode** A_ref, int new_data)
{
struct ListNode* new_node = new ListNode;
new_node->data = new_data;
new_node->next = (*A_ref);
(*A_ref) = new_node;
}
// Driver code
int main()
{
struct ListNode* A= NULL;
push(&A, 70);
push(&A, 60);
push(&A, 50);
push(&A, 40);
push(&A, 30);
push(&A, 20);
push(&A, 10);
reverseBetween(A, 3, 6);
print(A);
return 0;
}
错误消息分段错误(SIGSEGV)