Datawhale组队学习 Task02:顺序表和链表(2天)
Task02 顺序表和链表(2天)
1. 线性表的定义与操作
1.1 线性表的定义
线性表(Linear List)是由n(n >= 0)
个相同类型的数据元素a1,a2,...,an
组成的有序序列。即表中除首尾元素外,其它元素有且仅有一个直接前驱和直接后继。首元素仅有一个直接后继,尾元素仅有一个直接前驱。表中数据元素的个数称为表的长度,记为:(a1,a2,...,an)
。
1.2 线性表的操作
- 随机存取:获取或设置指定索引处的数据元素值。(支持索引器)
- 插入操作:将数据元素值插入到指定索引处。
- 移除操作:移除线性表指定索引处的数据元素。
- 查找操作:寻找具有特征值域的结点并返回其下标。
- 得到表长:获取线性表中实际包含数据元素的个数。
- 是否为空:判断线性表中是否包含数据元素。
- 清空操作:移除线性表中的所有数据元素。
以下代码为C#
版本:
using System;namespace LinearStruct
{/// <summary>/// 线性表的抽象数据类型/// </summary>/// <typeparam name="T">线性表中元素的类型</typeparam>public interface ILinearList<T> where T : IComparable<T>{/// <summary>/// 获取线性表中实际包含元素的个数/// </summary>int Length { get; }/// <summary>/// 获取或设置指定索引处的元素/// </summary>/// <param name="index">要获取或设置的元素从零开始的索引</param>/// <returns>指定索引处的元素</returns>T this[int index] { get; set; }/// <summary>/// 判断线性表中是否包含元素/// </summary>/// <returns>如果包含元素返回false,否则返回true.</returns>bool IsEmpty();/// <summary>/// 将元素插入到指定索引处/// </summary>/// <param name="index">从零开始的索引,应在该位置插入data.</param>/// <param name="data">要插入的元素</param>void Insert(int index, T data);/// <summary>/// 移除线性表指定索引处的元素/// </summary>/// <param name="index">要移除元素从0开始的索引</param>void Remove(int index);/// <summary>/// 在线性表中寻找元素data./// </summary>/// <param name="data">要寻找的元素</param>/// <returns>如果存在返回该元素在线性表中的位置,否则返回-1.</returns>int Search(T data);/// <summary>/// 从线性表中移除所有元素/// </summary>void Clear();}
}
2. 线性表的存储与实现
2.1 顺序存储(顺序表)
定义:利用顺序存储结构(即利用数组)实现的线性表。
特点:逻辑结构与存储结构相同;具有随机存取的特点。
实现:
以下代码为C#版本:
using System;namespace LinearStruct
{/// <summary>/// 用顺序存储结构实现的线性表/// </summary>/// <typeparam name="T">顺序表中元素的类型</typeparam>public class SeqList<T> : ILinearList<T> where T : IComparable<T>{/// <summary>/// 数据集合/// </summary>protected readonly T[] Dataset;/// <summary>/// 获取SeqList中实际包含元素的个数/// </summary>public int Length { get; private set; }/// <summary>/// 获取SeqList中最多包含元素的个数/// </summary>public int MaxSize { get; }/// <summary>/// 初始化SeqList类的新实例/// </summary>/// <param name="max">SeqList中最多包含元素的个数</param>public SeqList(int max){if (max <= 0)throw new ArgumentOutOfRangeException();MaxSize = max;Dataset = new T[MaxSize];Length = 0;}/// <summary>/// 获取或设置指定索引处的元素/// </summary>/// <param name="index">要获得或设置的元素从零开始的索引</param>/// <returns>指定索引处的元素</returns>public T this[int index]{get{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();return Dataset[index];}set{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();Dataset[index] = value;}}/// <summary>/// 判断SeqList中是否包含元素/// </summary>/// <returns>如果包含元素返回false,否则返回true.</returns>public bool IsEmpty(){return Length == 0;}/// <summary>/// 将元素插入到指定索引处/// </summary>/// <param name="index">从零开始的索引,应在该位置插入data.</param>/// <param name="data">要插入的元素</param>public void Insert(int index, T data){if (index < 0 || index > Length)throw new IndexOutOfRangeException();if (Length == MaxSize)throw new Exception("达到最大值");for (int i = Length; i > index; i--){Dataset[i] = Dataset[i - 1];}Dataset[index] = data;Length++;}/// <summary>/// 移除SeqList指定索引处的元素/// </summary>/// <param name="index">要移除元素从0开始的索引</param>public void Remove(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();for (int i = index; i < Length - 1; i++){Dataset[i] = Dataset[i + 1];}Length--;}/// <summary>/// 在SeqList中寻找元素data./// </summary>/// <param name="data">要寻找的元素</param>/// <returns>如果存在返回该元素在线性表中的位置,否则返回-1.</returns>public int Search(T data){int i;for (i = 0; i < Length; i++){if (Dataset[i].CompareTo(data) == 0)break;}return i == Length ? -1 : i;}/// <summary>/// 从SeqList中移除所有元素/// </summary>public void Clear(){Length = 0;}/// <summary>/// 反转/// </summary>public void Reverse(){for (int i = 0; i < Length/2; i++){T temp = Dataset[i];Dataset[i] = Dataset[Length - 1 - i];Dataset[Length - 1 - i] = temp;}}}
}
2.2 链式存储(链表)
利用指针方式实现的线性表称为链表(单链表、循环链表、双链表)。它不要求逻辑上相邻的数据元素在物理位置上也相邻,即:逻辑结构与物理结构可以相同也可以不相同。
2.2.1 单链表
定义:每个结点只含有一个链域(指针域)的链表。即:利用单链域的方式存储线性表的逻辑结构。
结构:
实现:
对结点的封装:
以下代码为C#
版本:
using System;namespace LinearStruct
{/// <summary>/// 单链表结点/// </summary>/// <typeparam name="T">结点中数据元素的类型</typeparam>public class SNode<T> where T : IComparable<T>{/// <summary>/// 获取或设置该结点的数据元素/// </summary>public T Data { get; set; }/// <summary>/// 获取或设置该结点的后继结点/// </summary>public SNode<T> Next { get; set; }/// <summary>/// 初始化SNode类的新实例/// </summary>/// <param name="data">该结点的数据元素</param>/// <param name="next">该结点的后继结点</param>public SNode(T data, SNode<T> next = null){Data = data;Next = next;}}
}
对单链表的封装:
以下代码为C#
版本:
using System;
using System.Collections;
using System.Collections.Generic;namespace LinearStruct
{/// <summary>/// 用链式存储结构实现的线性表--单链表/// </summary>/// <typeparam name="T">单链表中元素的类型</typeparam>public class SLinkList<T> : ILinearList<T>, IEnumerable<T> where T : IComparable<T>{/// <summary>/// 存储头结点/// </summary>public SNode<T> PHead { get; protected set; }/// <summary>/// 获取SLinkList中实际包含元素的个数/// </summary>public int Length { get; private set; }/// <summary>/// 初始化SLinkList类的新实例/// </summary>public SLinkList(){Length = 0;PHead = null;}/// <summary>/// 将元素插入到单链表的首部/// </summary>/// <param name="data">要插入的元素</param>public void InsertAtFirst(T data){PHead = new SNode<T>(data, PHead);Length++;}/// <summary>/// 获得指定索引处的结点/// </summary>/// <param name="index">元素从零开始的索引</param>/// <returns>指定索引处的结点</returns>private SNode<T> Locate(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();SNode<T> temp = PHead;for (int i = 0; i < index; i++){temp = temp.Next;}return temp;}/// <summary>/// 将元素插入到单链表的尾部/// </summary>/// <param name="data">要插入的元素</param>public void InsertAtRear(T data){if (PHead == null){PHead = new SNode<T>(data);}else{Locate(Length - 1).Next = new SNode<T>(data);}Length++;}/// <summary>/// 获取或设置指定索引处的元素/// </summary>/// <param name="index">要获得或设置的元素从零开始的索引</param>/// <returns>指定索引处的元素</returns>public T this[int index]{get{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();return Locate(index).Data;}set{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();Locate(index).Data = value;}}/// <summary>/// 判断SLinkList中是否包含元素/// </summary>/// <returns>如果包含元素返回false,否则返回true.</returns>public bool IsEmpty(){return Length == 0;}/// <summary>/// 将元素插入到指定索引处/// </summary>/// <param name="index">从零开始的索引,应在该位置插入data.</param>/// <param name="data">要插入的元素</param>public void Insert(int index, T data){if (index < 0 || index > Length)throw new IndexOutOfRangeException();if (index == 0){InsertAtFirst(data);}else if (index == Length){InsertAtRear(data);}else{Locate(index - 1).Next = new SNode<T>(data, Locate(index));Length++;}}/// <summary>/// 移除SLinkList指定索引处的元素/// </summary>/// <param name="index">要移除元素从0开始的索引</param>public void Remove(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();if (index == 0){PHead = PHead.Next;}else{Locate(index - 1).Next = Locate(index).Next;}Length--;}/// <summary>/// 在SLinkList中寻找元素data./// </summary>/// <param name="data">要寻找的元素</param>/// <returns>如果存在返回该元素在线性表中的位置,否则返回-1.</returns>public int Search(T data){int i;SNode<T> temp = PHead;for (i = 0; i < Length; i++){if (temp.Data.CompareTo(data) == 0)break;temp = temp.Next;}return i == Length ? -1 : i;}/// <summary>/// 从SLinkList中移除所有元素/// </summary>public void Clear(){PHead = null;Length = 0;}/// <summary>/// 链表的反转/// </summary>public void Reverse(){if (Length == 0 || Length == 1)return;SNode<T> currentNode = PHead;SNode<T> newNode = null;while (currentNode != null){SNode<T> tempNode = currentNode.Next;currentNode.Next = newNode;newNode = currentNode;currentNode = tempNode;}PHead = newNode;}/// <summary>/// 得到枚举数,用于支持foreach循环/// </summary>/// <returns>枚举数</returns>/// <exception cref="NotImplementedException"></exception>public IEnumerator<T> GetEnumerator(){SNode<T> current = PHead;while (current != null){yield return current.Data;current = current.Next;}}IEnumerator IEnumerable.GetEnumerator(){return GetEnumerator();}}
}
2.2.2 循环链表
定义:是一种首尾相连的单链表。即:在单链表中,将尾结点的指针域null改为指向pHead,就得到单链形式的循环链表。
表现形式:
通常情况下,使用尾指针表示循环链表。
实现:
以下代码为C#
版本:
using System;namespace LinearStruct
{/// <summary>/// 用链式存储结构实现的线性表--循环链表/// </summary>/// <typeparam name="T">循环链表中元素的类型</typeparam>public class CLinkList<T> : ILinearList<T> where T : IComparable<T>{/// <summary>/// /// </summary>public SNode<T> PRear { get; protected set; }/// <summary>/// 获取CLinkList中实际包含元素的个数/// </summary>public int Length { get; private set; }/// <summary>/// 获取或设置指定索引处的元素/// </summary>/// <param name="index">要获得或设置的元素从零开始的索引</param>/// <returns>指定索引处的元素</returns>public T this[int index]{get{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();return Locate(index).Data;}set{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();Locate(index).Data = value;}}/// <summary>/// 初始化CLinkList类的新实例/// </summary>public CLinkList(){Length = 0;PRear = null;}/// <summary>/// 判断CLinkList中是否包含元素/// </summary>/// <returns>如果包含元素返回false,否则返回true.</returns>public bool IsEmpty(){return Length == 0;}/// <summary>/// 将元素插入到循环链表的尾部/// </summary>/// <param name="data">要插入的元素</param>public void InsertAtRear(T data){if (IsEmpty()){PRear = new SNode<T>(data);PRear.Next = PRear;}else{SNode<T> temp = new SNode<T>(data, PRear.Next);PRear.Next = temp;PRear = temp;}Length++;}/// <summary>/// 将元素插入到循环链表的首部/// </summary>/// <param name="data">要插入的元素</param>public void InsertAtFirst(T data){if (IsEmpty()){PRear = new SNode<T>(data);PRear.Next = PRear;}else{SNode<T> temp = new SNode<T>(data, PRear.Next);PRear.Next = temp;}Length++;}/// <summary>/// 获得指定索引处的结点/// </summary>/// <param name="index">元素从零开始的索引</param>/// <returns>指定索引处的结点</returns>private SNode<T> Locate(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();SNode<T> temp = PRear.Next;for (int i = 0; i < index; i++){temp = temp.Next;}return temp;}/// <summary>/// 将元素插入到指定索引处/// </summary>/// <param name="index">从零开始的索引,应在该位置插入data.</param>/// <param name="data">要插入的元素</param>public void Insert(int index, T data){if (index < 0 || index > Length)throw new IndexOutOfRangeException();if (index == 0){InsertAtFirst(data);}else if (index == Length){InsertAtRear(data);}else{SNode<T> temp = Locate(index - 1);temp.Next = new SNode<T>(data, temp.Next);Length++;}}/// <summary>/// 移除CLinkList指定索引处的元素/// </summary>/// <param name="index">要移除元素从0开始的索引</param>public void Remove(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();if (PRear == PRear.Next){PRear = null;}else{if (index == Length - 1){SNode<T> temp = Locate(Length - 2);temp.Next = PRear.Next;PRear = temp;}else if (index == 0){PRear.Next = PRear.Next.Next;}else{SNode<T> temp = Locate(index - 1);temp.Next = temp.Next.Next;}}Length--;}/// <summary>/// 在CLinkList中寻找元素data./// </summary>/// <param name="data">要寻找的元素</param>/// <returns>如果存在返回该元素在线性表中的位置,否则返回-1.</returns>public int Search(T data){int i;SNode<T> temp = PRear;for (i = 0; i < Length; i++){if (temp.Next.Data.CompareTo(data) == 0)break;temp = temp.Next;}return (i == Length) ? -1 : i;}/// <summary>/// 从CLinkList中移除所有元素/// </summary>public void Clear(){Length = 0;PRear = null;}}
}
2.2.3 双链表
定义:每个结点含有两个链域(指针域)的链表。即:利用双链域的方式存储线性表的逻辑结构。
结构:
实现:
对结点的封装:
以下代码为C#
版本:
using System;namespace LinearStruct
{/// <summary>/// 双链表结点/// </summary>/// <typeparam name="T">结点中数据元素的类型</typeparam>public class DNode<T> where T : IComparable<T>{/// <summary>/// 获取或设置该结点的前趋结点/// </summary>public DNode<T> Prior { get; set; }/// <summary>/// 获取或设置该结点的后继结点/// </summary>public DNode<T> Next { get; set; }/// <summary>/// 获取或设置该结点的数据元素/// </summary>public T Data { get; set; }/// <summary>/// 初始化DNode类的新实例/// </summary>/// <param name="data">该结点的数据元素</param>/// <param name="prior">该结点的前趋结点</param>/// <param name="next">该结点的后继结点</param>public DNode(T data, DNode<T> prior = null, DNode<T> next = null){Prior = prior;Data = data;Next = next;}}
}
对双链表的封装:
以下代码为C#
版本:
using System;namespace LinearStruct
{/// <summary>/// 用链式存储结构实现的线性表--双链表/// </summary>/// <typeparam name="T">结点中数据元素的类型</typeparam>public class DLinkList<T> : ILinearList<T> where T : IComparable<T>{/// <summary>/// 存储头结点/// </summary>public DNode<T> PHead { get; protected set; }/// <summary>/// 存储尾结点/// </summary>public DNode<T> PRear { get; protected set; }/// <summary>/// 获取DLinkList中实际包含元素的个数/// </summary>public int Length { get; private set; }/// <summary>/// 初始化DLinkList类的新实例/// </summary>public DLinkList(){PHead = null;PRear = null;Length = 0;}/// <summary>/// 将元素插入到双链表的首部/// </summary>/// <param name="data">要插入的元素</param>public void InsertAtFirst(T data){if (IsEmpty()){DNode<T> temp = new DNode<T>(data);PHead = temp;PRear = temp;}else{DNode<T> temp = new DNode<T>(data, null, PHead);PHead.Prior = temp;PHead = temp;}Length++;}/// <summary>/// 将元素插入到双链表的尾部/// </summary>/// <param name="data">要插入的元素</param>public void InsertAtRear(T data){if (IsEmpty()){DNode<T> temp = new DNode<T>(data);PHead = temp;PRear = temp;}else{DNode<T> temp = new DNode<T>(data, PRear, null);PRear.Next = temp;PRear = temp;}Length++;}/// <summary>/// 获得指定索引处的结点/// </summary>/// <param name="index">元素从零开始的索引</param>/// <returns>指定索引处的结点</returns>private DNode<T> Locate(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();DNode<T> temp = PHead;for (int i = 0; i < index; i++){temp = temp.Next;}return temp;}/// <summary>/// 将元素插入到指定索引处/// </summary>/// <param name="index">从零开始的索引,应在该位置插入data.</param>/// <param name="data">要插入的元素</param>public void Insert(int index, T data){if (index < 0 || index > Length)throw new IndexOutOfRangeException();if (index == 0){InsertAtFirst(data);}else if (index == Length){InsertAtRear(data);}else{DNode<T> temp1 = Locate(index);DNode<T> temp2 = new DNode<T>(data, temp1.Prior, temp1);temp2.Prior.Next = temp2;temp2.Next.Prior = temp2;Length++;}}/// <summary>/// 移除DLinkList指定索引处的元素/// </summary>/// <param name="index">要移除元素从0开始的索引</param>public void Remove(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();if (Length == 1){PHead = null;PRear = null;}else{if (index == 0){PHead = PHead.Next;PHead.Prior = null;}else if (index == Length - 1){PRear = PRear.Prior;PRear.Next = null;}else{DNode<T> temp = Locate(index);temp.Prior.Next = temp.Next;temp.Next.Prior = temp.Prior;}}Length--;}/// <summary>/// 判断DLinkList中是否包含元素/// </summary>/// <returns>如果包含元素返回false,否则返回true.</returns>public bool IsEmpty(){return Length == 0;}/// <summary>/// 从DLinkList中移除所有元素/// </summary>public void Clear(){Length = 0;PHead = null;PRear = null;}/// <summary>/// 在DLinkList中寻找元素data./// </summary>/// <param name="data">要寻找的元素</param>/// <returns>如果存在返回该元素在线性表中的位置,否则返回-1.</returns>public int Search(T data){int i;DNode<T> temp = PHead;for (i = 0; i < Length; i++){if (temp.Data.CompareTo(data) == 0)break;temp = temp.Next;}return i == Length ? -1 : i;}/// <summary>/// 获取或设置指定索引处的元素/// </summary>/// <param name="index">要获得或设置的元素从零开始的索引</param>/// <returns>指定索引处的元素</returns>public T this[int index]{get{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();return Locate(index).Data;}set{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();Locate(index).Data = value;}}}
}
3. 练习参考答案
1. 合并两个有序链表
以下代码为Java
版本:
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*//*** @param l1 第一个链表* @param l2 第二个链表* @return 合并后的链表头节点*/
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {if(l1 == null){return l2;}if(l2 == null){return l1;}ListNode head = new ListNode(0);head.next = null;ListNode temp, q;q= head;while(l1 != null && l2 != null){if(l1.val < l2.val){temp = l1;l1 = l1.next;}else{temp = l2;l2 = l2.next;}q.next = temp;q = temp;}ListNode node = l1 == null ? l2 : l1;q.next = node;return head.next;}class ListNode{int val;ListNode next;ListNode(int x){val = x;}
}
以下代码为C#
版本:
/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int x) { val = x; }* }*/
public class Solution
{public ListNode MergeTwoLists(ListNode l1, ListNode l2){ListNode pHead = new ListNode(int.MaxValue);ListNode temp = pHead;while (l1 != null && l2 != null){if (l1.val < l2.val){temp.next = l1;l1 = l1.next;}else{temp.next = l2;l2 = l2.next;}temp = temp.next;}if (l1 != null)temp.next = l1;if (l2 != null)temp.next = l2;return pHead.next;}
}
2. 删除链表的倒数第N个节点
以下代码为Java
版本:
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*//*** @param head 待操作链表头节点* @param n 要删除倒数第n个节点* @return 删除制定节点后的链表头节点*/
public ListNode removeNthFromEnd(ListNode head, int n) {if(head.next == null){return null;}ListNode p, q;q = head;int i = 1;while((i < n+1) && q != null){q = q.next;i++;}if(q == null){head = head.next;return head;}p = head;while(q.next != null){q = q.next;p = p.next;}p.next = p.next.next;return head;}class ListNode {int val;ListNode next;ListNode(int x) { val = x; }
}
以下代码为C#
版本:
/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int x) { val = x; }* }*/public class Solution
{public ListNode RemoveNthFormEnd(ListNode head, int n){int len = GetLength(head);int index = len - n;if (index == 0){head = head.next;return head;}ListNode temp = head;for (int i = 0; i < index - 1; i++){temp = temp.next;}temp.next = temp.next.next;return head;}public int GetLength(ListNode head){ListNode temp = head;int i = 0;while (temp != null){i++;temp = temp.next;}return i;}
}
以下代码为C#
版本:
/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int x) { val = x; }* }*/
public class Solution
{public ListNode RemoveNthFormEnd(ListNode head, int n){ListNode temp1 = head;ListNode temp2 = head;int len = 0;int index = 0;while (temp1 != null){temp1 = temp1.next;len++;if (index == n){break;}index++;}if (len == n){head = head.next;return head;}while (temp1 != null){temp1 = temp1.next;temp2 = temp2.next;}temp2.next = temp2.next.next;return head;}
}
3. 旋转链表
以下代码为C#
版本:
/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int x) { val = x; }* }*/public class Solution
{public ListNode RotateRight(ListNode head, int k){if (head == null || k == 0)return head;int len = GetLength(head);int index = len - k%len;if (index == len)return head;ListNode temp1 = head;ListNode temp2 = head;for (int i = 0; i < index - 1; i++){temp1 = temp1.next;}head = temp1.next;temp1.next = null;temp1 = head;while (temp1.next != null){temp1 = temp1.next;}temp1.next = temp2;return head;}public int GetLength(ListNode head){ListNode temp = head;int i = 0;while (temp != null){i++;temp = temp.next;}return i;}
}
相关文章:

腾讯联姻开心网意欲何为
今天杨长升在新浪科技上看到这样一条信息“腾讯日前已收购开心网部分股份,有意成为开心网大股东。”据了解,早在8月就曾有消息称,腾讯已收购开心网部分股份,现有一位投资界人士处证实了最新的消息:“腾讯参股开心网确有…

在Excel单元格中使用下拉框
文章出处: http://www.cnblogs.com/huangcong/archive/2010/05/21/1740539.html 有时候我们只希望在Excel中的某个单元格中只允许输入某几个限定的数据,这时候我们就可能希望把该单元格设置成为下拉框的形式了,如下图所示: 下面就看看是怎么实现的吧. 1.我们选择一个单元格--数…

JavaScript中常见的错误,你犯了几个?
初学者在学JavaScript这门语言的时候,最害怕看到的,应该就是控制台出现的红色错误信息!其实解决这些错误并不难,这是大多数初学者难以跨越的一个心理障碍而已。 你只要认真看一看错误信息,其实解决错误是非常简单的。别说你英语不…

Datawhale组队学习 Task03:栈与递归(2天)
Task03:栈与递归(2天) 栈是我们经常使用的一种数据结构,如下图所示,手枪发射子弹的顺序与子弹压入弹夹的顺序是相反,即后压入弹夹的子弹先发射出来。 比如我们使用的Word、Excel、Photoshop等软件系统中的…

sql_trace的介绍
sql_trace的介绍 --打开trace文件设置,把sql trace设置为true,就会在udump目录中增加一个trc文件。alter session set sql_tracetrue;show parameter sql_trace;(select * from v$parameter where namesql_trace;)修改后不生效呢&…

Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数
ylbtech-Arithmetic:Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数1.A,Demo(案例)输入两个正整数m和n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。 1.B,Solution(解决方案)usin…

UI设计培训之如何将设计理论与实践相结合
学习UI设计理论知识与实践技术都是要有的,很多人都不爱去听理论知识,这对以后的工作是没有任何帮助的,只有将设计理论与实践相结合才能帮助到自己,那么如何将设计理论与实践相结合?来看看本期下面的详细介绍。 如何将设计理论与实…

Datawhale组队学习 Task04:队列(2天)
Task04:队列(2天) 队列也是我们经常使用的一种数据结构,如下图所示,购物结账,去食堂打饭等都需要排队,而结账或打饭的顺序与我们排队的顺序是相同的,即谁先排队就为谁先服务。 比如…

ios(iphone/ipad)开发笔记(1)
CGContextRefCGContextRefiphone开发刚刚入门 求个师傅iphone拨号键盘请问自己如果做sdkOpenGL ES 2.0有没有顶点光照的例子?socket通信哪位大侠帮帮忙?如何在tableView中使用自定义的cell?新手求指导Iphone按大圆钮时触发什么事件flash视频转…

如何查看Linq to SQL运行时,实际执行的Sql语句
调试Linq to sql代码是, 如果遇到错误,很难判断错误的原因是什么,如果能够输出实际执行的sql原文,对于我们寻找错误的原因有有很大帮助。 以下是我用到的方法: StringBuilder sql new StringBuilder();try{using (var context n…

Java培训零基础学员必须要知道的知识点
学习java那么遇到的知识点有很多,很多同学都会问到一些关于java的编程知识点,下面小编就为大家整理一下java培训零基础学员必须要知道的6个知识点。 Java培训零基础学员必须要知道的6个知识点: JVM作为java运行的基础来说,掌握透析…

SpringCloud Alibaba集成 Gateway(自定义负载均衡器)、Nacos(配置中心、注册中心)、Loadbalancer
要为未被某些网关路由谓词处理的请求提供相同的CORS配置,请将属性spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping设置为true。断言(Predicate):Java8中的断言函数,Spring Cloud Gateway中的断言函数输入类型是 Spring5.0框架中的ServerWebExchange。对于所有GET请求的路径,来自docs.spring.io的请求都将允许CORS请求。

并发编程下的集合:数组寻址、LinkedList、HashMap、ConcurrentHashMap
如果发现hash取模后的数组索引位下无元素则直接新增,若不是空那就说明存在hash冲突,则判断数组索引位链表结构中的第一个元素的key以及hash值是否与新的key一致则直接覆盖,若不一致则判断当前的数组索引下的链表结构是否为红黑树,若为红黑树则走红黑树的新增方法,若不为红黑树则遍历当前链表结构,遍历中发现某个节点元素的next为null是则直接将新元素指针与next进行关联,若在遍历到next为空前判断到,某个节点的key以及key的hash值与新的key与新的keyhash值一致时则走覆盖。

【日常开发之插件篇】IDEA plugins 神器助我!!
今早因为老代码的一些bug让我突然觉得Idea的一些插件特别好用,我准备将我平时所用到的一些插件做个推荐以及记录。

【日常开发之FTP】Windows开启FTP、Java实现FTP文件上传下载
FTP是一个专门进行文件管理的操作服务,一般来讲可以在任意的操作系统之中进行配置,但是如果考虑到简便性,一般来讲可以直接在Linux系统下进行安装。FTP (File Transfer Protocol、文件传输协议)是TCP/IP协议中的一部分,属于应用层协议。使用FTP最主要的功能是对文件进行管理,所以在FTP内部对于文件支持有两种传输模式:文本模式(ASCII、默认)和二进制模式(Binary),通常文本文件使用ASCIl模式,而对于图片、视频、声音、压缩等文件则会使用二进制的方式进行传输。

【Linux之升华篇】Linux内核锁、用户模式与内核模式、用户进程通讯方式
alloc_pages(gfp_mask, order),_ _get_free_pages(gfp_mask, order)等。字符设备描述符 struct cdev,cdev_alloc()用于动态的分配 cdev 描述符,cdev_add()用于注。外,还支持语义符合 Posix.1 标准的信号函数 sigaction(实际上,该函数是基于 BSD 的,BSD。从最初的原子操作,到后来的信号量,从。(2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的。

【Mongdb之数据同步篇】什么是Oplog、Mongodb 开启oplog,java监听oplog并写入关系型数据库、Mongodb动态切换数据源
oplog是local库下的一个固定集合,Secondary就是通过查看Primary 的oplog这个集合来进行复制的。每个节点都有oplog,记录这从主节点复制过来的信息,这样每个成员都可以作为同步源给其他节点。Oplog 可以说是Mongodb Replication的纽带了。

zookeeper集群部署以及zookeeper原理
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper包含一个简单的原语集,提供Java和C的接口。

【日常开发之Windows共享文件】Java实现Windows共享文件上传下载
下拉框选择你选择的用户点击添加,然后共享确定。创建一个文件夹然后点击属性界面,点击共享。maven版本存在于SMB协议的兼容问题。首先开启服务,打开控制面板点击程序。点击启用或关闭Windows功能。我这边是专门创建了一个用户。SMB1.0选中红框内的。

rust wasm入门
demo## 编译 Rust 为 WebAssembly在本教程中,我们将使用 Rust 的 npm 包构建工具 wasm-pack 来构建一个 npm 包。

minikube环境搭建
📕作者简介:过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。📘相关专栏系列、spring教程等,大家有兴趣的可以看一看📙系列,系列、系列正在发展中,喜欢Java,GoLang,Rust,的朋友们可以关注一下哦!@[TOC]# minikube## 安装### 前置条件已经安装docker### 乌班图安装科学上网是我你们安装的前提。```shell。

Pods/Nodes
Pod 容器组 是一个k8s中一个抽象的概念,用于存放一组 container,以及这些 container (容器)的一些共享资源。共享存储,称为卷(Volumes),即图上紫色圆柱网络,每个 Pod(容器组)在集群中有个唯一的 IP,pod(容器组)中的 container(容器)共享该IP地址container(容器)的基本信息,例如容器的镜像版本,对外暴露的端口等Pod(容器组)是 k8s 集群上的最基本的单元。

公布应用程序
当 worker node(节点)故障时,节点上运行的 Pod(容器组)也会消失。然后,Deployment (opens new window)可以通过创建新的 Pod(容器组)来动态地将群集调整回原来的状态,以使应用程序保持运行。举个例子,假设有一个图像处理后端程序,具有 3 个运行时副本。这 3 个副本是可以替换的(无状态应用),即使 Pod(容器组)消失并被重新创建,或者副本数由 3 增加到 5,前端系统也无需关注后端副本的变化。

伸缩应用程序和执行滚动更新
原本 Service A 将流量负载均衡到 4 个旧版本的 Pod 上2. 更新完 Deployment 部署文件中的镜像版本后,master 节点选择了一个 worker 节点,并根据新的镜像版本创建 Pod(紫色容器)。新 Pod 拥有唯一的新的 IP。同时,master 节点选择一个旧版本的 Pod 将其移除。此时,Service A 将新 Pod 纳入到负载均衡中,将旧Pod移除同步骤2,再创建一个新的 Pod 替换一个原有的 Pod。

Kubernetes对象的定义和操作
Kubernetes对象指的是Kubernetes系统的持久化实体,所有这些对象合起来,代表了你集群的实际情况。常规的应用里,我们把应用程序的数据存储在数据库中,Kubernetes将其数据以Kubernetes对象的形式通过 api server存储在 etcd 中。集群中运行了哪些容器化应用程序集群中对应用程序可用的资源应用程序相关的策略定义,例如,重启策略、升级策略、容错策略其他Kubernetes管理应用程序时所需要的信息。

名称和命名空间
📕作者简介:过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。📘相关专栏系列、spring教程等,大家有兴趣的可以看一看📙系列,系列、系列正在发展中,喜欢Java,GoLang,Rust,的朋友们可以关注一下哦!

使用名称空间共享集群
可以限定使用某个名称空间的用户不能看到另外一个名称空间中的内容。默认情况下,安装Kubernetes集群时,会初始化一个 default 名称空间,用来将承载那些未指定名称空间的 Pod、Service、Deployment等对象。接下来,为 kubectl 定义一个上下文,以便在不同的名称空间中工作。此时,开发人员可以做任何他想要做的操作,所有操作都限定在名称空间 development 里,而无需担心影响到 production 名称空间中的内容。使用 kubectl 有两种方式可以创建名称空间。

k8s 标签和选择器
标签(Label)是附加在Kubernetes对象上的一组名值对,其意图是按照对用户有意义的方式来标识Kubernetes对象,同时,又不对Kubernetes的核心逻辑产生影响。管理这些对象时,很多时候要针对某一个维度的条件做整体操作,例如,将某个版本的程序整体删除,这种情况下,如果用户能够事先规划好标签的使用,再通过标签进行选择,就会非常地便捷。Kubernetes api server支持两种形式的标签选择器,equality-based 基于等式的 和 set-based 基于集合的。

iced 入门一
本教程的目标是创建一个简单的购物清单应用程序。我们希望允许添加和删除购物清单中的项目。在编写代码之前,我们必须首先了解 Iced 构建的结构:Elm 架构。它是 GUI 库使用的架构,最初用于 Elm 编程语言。它的核心原则很简单。它围绕三个概念构建:模型、视图和更新。

shell编程
简单来说“Shell 编程就是对一堆 Linux 命令的逻辑化处理”。