一、反转链表1
1.c++解法
/**
* 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 *new_head=NULL;
while(head){
ListNode *next=head->next;
head->next=new_head;
new_head=head;
head=next;
}
return new_head;
}
};
刚开始看刷题班老师的代码,一直没想明白head->next=new_head是个啥,后来突然明白了,你把new_head想象成pre结点,所谓的反转就是后面的指向前面,一个一个改过来就好了。
二、反转链表2
1、c++解法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
int node_num=n-m+1;//计算需要逆置的结点个数
ListNode *pre_head=NULL;//开始逆置的节点的前驱
ListNode *result=head;//最终转换后的链表头结点,除了m=1时要特殊考虑,说明从第一个结点开始逆置
while(head&&--m){//将head向前移动到开始逆置的位置m,也就是移动了m-1个位置
pre_head=head;//记录head的前驱
head=head->next;
}
ListNode *tail=head;//尾部记录的是逆置之前的头部
ListNode *pre=NULL;//pre记录要逆置的头结点的前驱;
ListNode *next=NULL;
while(head&&node_num){
next=head->next;
head->next=pre;
pre=head;
head=next;
node_num--;
}
tail->next=head;//此时head通过前面的while循环已经到达了逆置的最后一个结点n的next结点
if(pre_head){//不为空说明不是从第一个结点开始逆置
pre_head->next=pre;
}
else{
result=pre;
}
return result;
}
};