题型一:链表直接反转(1->2->3->4反转后变为4->3->2->1)
typedef struct listnode listnode;
struct listnode* reversenode(struct listnode* head)
{
listnode* newnode = NULL;
listnode* cur = head;
while(cur!=NULL)
{
listnode* next = cur->next;
cur->next = newnode;
newnode = cur;
cur = next;
}
return newnode;
}
题型二:指定区间反转(
例如:给出的链表为 1→2→3→4→5→𝑁𝑈𝐿𝐿1→2→3→4→5→NULL,m=2,n=4,
返回 1→4→3→2→5→NULL.)
typedef struct ListNode listnode;
struct ListNode* reverseBetween(struct ListNode* head, int m, int n )
{
if(head==NULL||head->next==NULL||m==n)
{
return head;
}
listnode* newnode = (listnode*)malloc(sizeof(newnode));//创建空白节点
newnode->next = head;//指向头节点
listnode* p = newnode;
listnode* q = newnode;
int i = 1;
while(i<m)
{
p = p->next;//p指向m的前一个结点
i++;
}
int j = 1;
while(j<=n)
{
q = q->next;//q指向第n个节点
j++;
}
listnode* p1 = p->next;//指向m节点
listnode* p2 = p1->next;//指向m节点的下一个
p->next = q;
p1->next = q->next;
while(p2!=q)//区间内反转
{
p = p2->next;
p2->next = p1;
p1 = p2;
p2 = p;
}
p2->next = p1;
return newnode->next;
}
两者区别是指定区间反转链表不需要创建头节点,只需定义一个节点指向开始反转的前一个节点