链表
1 反转链表
核心思想
1.生成一个新节点 ListNode* pre = NULL
2.记录当前节点的逆转前的下一个节点 ListNode* next = head->next;
3.让下一个节点指向当前上一个节点(第一个节点指向空) head->next=pre
4.一直遍历到最后一个节点 pre = head; head = next;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *pre = NULL;
while(head){
ListNode* next = head->next;
head->next = pre;
pre = head;
head = next;
}
return pre;
}
};
2 反转链表 b(逆置 m-n的代码)
#include<stdio.h>
struct ListNode{
int val;
ListNode* next;
ListNode(int x) : val(x) ,next(NULL) {}
};
class Solution{
public:
ListNode* reverse_b(ListNode *head,int m,int n){
if(m<1 && m>n){
printf("error data\n");
}
int change_len = n-m+1; //需要逆置的结点个数
ListNode *pre_head = NULL; //初始化开始逆置的结点的前驱
ListNode *result = head; //最终转换后的链表头结点,非特殊情况即为head
while(head && --m){ //将head向前移动m-1个位置,注意如果m=1,pre_head还是为NULL,while循环不执行
pre_head = head; //记录head的前驱
head = head->next;
}
ListNode *modify_list_tail = head; //将modify_list_tail指向当前的head,即逆置段逆置后的链表尾
ListNode *new_head = NULL;
while(head && change_len){ //逆置change_len个结点
ListNode *next = head->next;
head->next = new_head;
new_head = head;
head = next;
change_len--; //每完成一个结点逆置,change_len--
}
modify_list_tail->next = head; //连接逆置后链表尾 与 逆置段的后一个结点
if(pre_head){ //如果pre_head不空,说明不是从第一个结点开始逆置的m>1, 就是逆置段不包括头结点result的情况
pre_head->next = new_head; //将逆置链表开始的结点前驱与逆置后的头结点连接
}
else{ //如果逆置段包括了头结点,头结点元素成了逆置段 逆置后的尾元素
result = new_head; //result为逆置前链表头结点的位置,如果pre_head为空,说明 m==1,
//从链表第一个结点开始逆置,链表头结点变为逆置段逆置后的尾结点,逆置前逆置段的尾结点成了逆置后整个链表头结点
}
return result;
}
};
int main(){
ListNode a(1);
ListNode b(2);
ListNode c(3);
ListNode d(4);
ListNode e(5);
a.next = &b;
b.next = &c;
c.next = &d;
d.next = &e;
Solution solve;
ListNode *head = &a;
printf("Before reverse: \n");
while(head){
printf("%d\n",head->val);
head = head->next;
}
printf("Please Input m and n:\n");
int m,n;
scanf("%d%d",&m,&n);
head = solve.reverse_b(&a,m,n);
printf("After reverse:\n");
while(head){
printf("%d\n",head->val);
head = head->next;
}
}