主要内容

  1. 进程和线程的区别是什么?
  2. 单链表的反转

进程和线程的区别是什么?

什么是进程?

进程是操作系统分配资源的基本单元。是程序执行的一个实例。对应着操作系统中一个正在运行的程序。

什么是线程?

线程是进程执行任务的基本单元。线程是进程的一个实体,是进程的一条执行路径。线程是进程的一个特定执行路径。当一个线程修改了进程的资源,它的兄弟线程可以立即看到这种变化。

它们的区别

  1. 地址空间和其它资源
    进程是操作系统分配资源的独立单元。因此进程之间资源是不能共享的。同一个进程内的线程可以共享进程内的资源。且不同进程中的线程也是独立的。
  2. 通信
    进程间的通信比较的复杂,一般通过管道,信号量,共享内存,消息队列等方式。而同一进程下的线程通信却非常的简单,可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性
  3. 调度和切换
    线程的切换要比进程的切换快得多。
  4. 在多线程OS中
    进程是一个不可执行的实体。多线程OS中执行任务的基本单位是线程。

单链表的反转

题目:
输入一个链表,反转链表后,输出新链表的表头。
单链表的反转是一个非常常见的题型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public ListNode ReverseList(ListNode head) {
if(head==null||head.next==null) {
return head;
}
ListNode pre = null; // 当前节点的前一个节点
ListNode cur=head; //当前节点
ListNode next = null; // 当前节点的下一个节点
while( cur != null){
next = cur.next; // 记录当前节点的下一个节点位置;
cur.next = pre; // 让当前节点指向前一个节点位置,完成反转
pre = cur; // pre 往右走
cur = next;// 当前节点往右继续走
}
//循环结束时cur==null,那么它的前一个节点即pre就是指向
//翻转后的头节点
return pre;
}

解释:
QGWcPU.png
写得仓促,字丑见谅
这个地方有个可以优化的地方,就是完全可以用head代替cur。为了逻辑清晰,上面的代码依然使用了cur。