链表基础题

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

2.删除所有值为x的节点(没要求递归)

思路:创建一个p和pre指针,一个指向当前节点,一个指向前一个节点

如果遇到相同,那么就”跨越”这个节点

图片.png

3.反向输出链表

思路:一直递归到最后,从而输出从里层往外输出

图片.png

4.删除链表中最小元素

##思路:维护最小值指针和他的前驱指针,遍历记录最小值,最后删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
c复制代码void DeleMin(LinkList &L){

LNode *pre=L,*p=pre->next;
LNode *minpre=pre,*minp=p; //记录最小值得节点以及他的前驱

while(p != NULL){
if(p->data < minpre->data){ //后一个比前一个小
min = p; //维护min处于最小节点位置
minpre = pre; //维护minpre处于最小节点的前驱
}
p = p->next; //大步往前走
pre = pre->next; //大步往前走
}
minpre->next = min->next; //删除最小值
free(minp);
return L;
}

5.链表就地反转

思路:维护两个指针,cur和pre,让pre永远在cur的前方

1
2
3
4
5
6
7
8
9
10
c复制代码ListNode reverseList(ListNode head) {
ListNode *pre = NULL, *cur = head;
while (cur != NULL) {
ListNode *t = cur->next; //再存cur的下一个指针
cur->next = pre; //cur指向pre
pre = cur; //cur往前走一步
cur = t; //pre往前走一步
}
return pre;
}

6.重排链表,使其变成递增序列

思路:使用插入排序每次遍历到的节点,插入到前面的有序表中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
c复制代码void Sort(LinkList &L){
LNode *p = L->next;
LNode *r = p->next; //保存p的后继,防止断链
LNode *pre;
p->next = NULL; //构造第一个有序表
p = r;

while(p != NULL){
r = p->next;
pre = L;
while(pre->next != NULL && pre->next->data < p->data){
pre = pre->next; //pre往前走,寻找插入p的前驱结点
}
p->next = pre->next; //将*p插入到*pre之后
pre->next = p;
p = r;
}
}

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%