一、单链表问题
定义ListNode节点结构体
struct ListNode {
int val;
ListNode *next; //定义节点的后继
ListNode(int x) : val(x),next(NULL){
}//声明一个节点
};
1、链表反转
1->2->3->4->5->null
^
root
逆序的思路:首先声明一个空指针node指向一个空节点,然后将原链表中的节点1指向node,接着声明一个临时根节点root用来保存链表的表头,循环操作,直到root为空指针
示例程序如下:
ListNode *reverse(ListNode *root)
{
ListNode *node = nullptr;
while(root){
ListNode *next = root->next; //保存表头的位置
//由于逆序,因此此时原表头的下一个节点为空节点 ,下一个node为原表头
root->next = node;
node = root; //保存此时的根节点,准备下一次连接
root = next; //重置新的表头
}
return node;
}
程序执行流程如下:
//step1: 保存表头的位置
ListNode *next = root->next;
2->3->4->5->null
^
next
//step2:连接新的链表
root->next = node;
1->null
^
root
//step3:更新待连接的节点位置
node = root;
1->null
^
node
//step4:更新表头位置
root = next;
2->3->4->5->null
^
root
//循环操作,直到root为null
2、链表去重
去除链表中重复的数字,分两种情况:1,链表是有序链表;2,链表是无序链表
2.1有序链表去重
有序链表:即链表中的元素按照一定顺序排列,链表中的相同元素是相邻的,比如升序,降序。
eg:
1->2->2->3->4->