这可能是B站讲的最好的数据结构算法-leetcode真题解析(2021年最新版)
小QQ的粉丝头头:
很容易想到[脱单doge]
private static void reverseList(Node list) {
Node prev = null;
Node head = list;
Node curr = list.next;
Node next;
while (curr != null) {
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
head.next = prev;
}
【回复】这里是错的,我必须要回复下,以免引导基础差的观众:head最后肯定是指向null
【回复】回复 @许风尘 :带头指针是没问题 但是这段代码运行的结果是错误的,并没有完成链表的反转
【回复】回复 @许风尘 :2号节点的next会指向null
孝陵卫迪巴拉:
我觉得语言不同反而学的效果更好,看视频学方法然后自己用不同的语言来实现,可以加深理解
【回复】求赞,看到个谷歌和阿里大佬的Leetcode刷题笔记,笔记共 1200 页,都在这里:https://pan.baidu.com/s/17A21Msw4GmaEQgfJvvNngA
提取码:6688
【回复】https://github.com/hehanpeng/learn-go/blob/master/leetcode/test1-1/reverse_list.go 可以用go实现一遍
传奇螺旋丸大王:
跟着老师,写了个反转代码[奋斗]
/**
*
* @param head 链表头部
* @return 返回倒序后的链表头部
*/
public static ListNode iterate(ListNode head){
ListNode prev=null;
ListNode next;
ListNode current = head;
while (current != null){
next = current.next; //保存下一个
current.next = prev; //当前连接上一个
prev = current; //将上一个后移
current = next; //将当前后移
}
return prev;
}
【回复】看了你的评论,我悟了[打call]
netwndyd:
这个递归时间有点长,其实递归可以从头开始,看看这个python可不可以
def reverse_linklist_r(l,p):
#1 2 3 4 5 6
#2 1 3 4 5 6
#3 2 1 4 5 6
#4 3 2 1 5 6
#if l.head.next==p:
# l.head.next=None
if p==None:
return
n=p.next
p.next=l.head
l.head=p
reverse_linklist_r(l,n)
AngelBestMing:
List Reverse(List L)
{
PtrToNode p;
PtrToNode q;
PtrToNode r;
if(L==NULL) return L;
p=L;
q=L->Next;
L->Next=NULL;
while(q)
{
r=q->Next;
q->Next=p;
p=q;
q=r;
}
L=p;
return L;
}
Gwing97:
;; 在LISP、Scheme下,只使用七个原始操作符实现的列表反转
;; 用尾递归实现的列表反转函数
;; 接受的参数为:还未反转的部分remind_list,已反转的部分rev_list
(define (reverse_list_recursive remind_list rev_list)
(if (atom? (cdr remind_list))
(cons (car remind_list) rev_list)
(reverse_list_recursive
(cdr remind_list)
(cons (car remind_list) rev_list)
)
)
)
;; 列表反转函数,对外接口
(define (reverse_list list)
(reverse_list_recursive list (quote ()))
)
(reverse_list (quote (2 3 1 5 4 a b c)))
;; 使用示例,输出结果为:
;; > (c b a 4 5 1 3 2)
李在赣神魔恋:
指正一下up关于第36集视频中用BFS求解省份数目,其中关于内层循环的代码,if的条件判断为:
if(isConnected【i】【j】 ==1 && !visited【j】){
queue.offer();} 这里其实不对的,由于第一次外层for循环中得到的i为0,假设此时的结构是0-1-2,3是独立的,那么这是的省份数应该是2。而源码中的条件会导致,0已经在队列中,那么出队,i=0,k=0,那么先找出0的一阶邻居只有1,将1入队,此时队不空,继续出队。注意此刻的i依旧等于0,而k=1,如果继续判断节点0的邻居,由于节点0的邻居1已经被访问过了,所以不在继续执行入队操作,此时队空,province++;外层for循环继续,此时i=1,出队,k=1,那么会判断到1-2即2入队,没有问题,再出队2,队列为空,province++;对于2的内层循环不会执行,因为2的邻居只有1,并且1已经被访问过了;那么直至遍历到3,因为3只是一个孤立的节点,那么入队再出队,province++。综上,province总共被加了三次,这显然是不对的。因此问题就出在内层循环的if判断语句中,只需将【i】【j】改成【k】【j】即可。
y_perpetual:
讲的很好的,也没必要去跟其他的比较。针对于了解过数据结构的,需要仔细回味老师教的内容,会很有帮助。
55421573021_bili:
为什么斐波拉契去重递归答案错误?
public static int fib(int n) {
int【】 arr = new int【n + 1】;
return recurse(arr,n);
}
private static int recurse(int【】 arr,int n){
if(n == 0){
return 0;
}
if(n == 1){
return 1;
}
if(arr【n】 != 0){
return arr【n】;
}
arr【n】 = recurse(arr,n-1) + recurse(arr,n-2);
return arr【n】;
}
bili_13823952554:
假如题目可以要求不完全排列,用这个
public static int arrangeCoins(int n){
int sum=n;
for(int i=1;i<=n;i++){
if (i>=sum){
return i;
}
sum-=i;
}
return 0;
}