持续更新
链表基础知识
图示:
代码:
#include <stdio.h>
struct ListNode {
int val; //存储元素的数据域
ListNode *next;
}; //存储下一节点地址的指针域
int main(){
ListNode a;
ListNode b;
ListNode c;
ListNode d;
ListNode e;
a.val = 10;
b.val = 20;
c.val = 30;
d.val = 40;
e.val = 50;
a.next = &b; //------1-----
b.next = &c;
c.next = &d;
d.next = &e;
e.next=NULL; //----2-------
ListNode $head = &a;
while(head){
printf("%d\n",heas->val)
head = head->next; //-----3------
}
return 0;
}
8道经典链表常考题目-----LeetCode
链表逆序(easy)-----206
已知链表头节点指针head,将链表逆序。(不可申请额外空间)
图示:
在这里插入图片描述
代码:
struct ListNode {
int val; //存储元素的数据域
ListNode *next;//指针域
ListNode(int x) : val(x), next(NULL) {}
}; //构造函数
class Solution{
public: //链表头节点指针
ListNode* reverseList(ListNode* head){
} //返回链表逆序后的头节点指针
};
思路:
代码:
class Solution{
public: //链表头节点指针
ListNode* reverseList(ListNode* head){
ListNode *new_head = NULL;//指向新链表头节点的指针
while(head){
ListNode *next = head->next;//备份head->next-----1-----
head->next = new_head;//更新head=>next-----2-----
new_head = head;//移动new_head----3-----
head = next;//遍历链表
}
return new_head;//返回新链表头节点
} //返回链表逆序后的头节点指针
};
测试:
int main(){
ListNode a;
ListNode b;
ListNode c;
ListNode d;
ListNode e;
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;
}
head = solve.reverseList(&a);
prtinf("After reverse:\n");
while(head){
printf("%d\n",head->val);
head = head->next;
}
return 0;
}
链表逆序2(medium)-----92
已知链表头节点指针head,将链表从位置m到n逆序。(不申请额外空间)
图示:
代码:
class Solution{
public:
ListNode* reverseBetween(ListNode* head, int m, int n){
}
};
思路:
思考:
1.最终结果应该返回哪个节点?
2.如果m=1时,有什么特殊的?
代码:
class Solution{
public:
ListNode* reverseBetween(ListNode* head,int m,int n){
int change_len =n - m + 1;//计算需要逆置的节点个数
ListNode *pre_head = NULL;//初始化开始逆置的节点的前驱
ListNode *result = head;//最终转换后的链表头节点,非特殊情况即为head
while(head && ==m){ //将head向前移动m-1个位置
//-------1-------
head = head->next;
} //将modify_list_tail指向当前的head,即逆置后的链表尾
ListNode *modify_list_tail = head;
ListNode *new_heaad = NULL;
while(head && change_len){//逆置change——len个节点
ListNode *next = head->next;
head->next = new_head;
new_head = head;
head = next;
//-------2-----
}
//-----3------
if (pre_head){ //如果pro——head不变,说明不是从第一个结点开始逆置的m》1
//-----4------
}
else{
//--------5-----
}
return result;
}
};