实例一:两个单链表的交叉合并
代码实现效果:
此处单链表交叉合并的算法思想是:
node1 node2 分别指向list1 list2。第一步,从list2中取出一个节点,list2.Head = node2.Next。解释:list2的头节点本是指向第一个节点,现在指向第一个节点(也就是node2)的后面一个点。第二步,取下的点插入list1。
node2.Next = node1.Next;
node1.Next = node2;
node2接管list1的头节点(node1)后的节点node1指向list2取下的节点。
一次操作完成,重置node1,node2。此时node1应该是指向第三号元素,也就是node2后的元素。
C# Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
using System;
using System.Collections.Generic; using System.Linq; using System.Text; namespace LinkList { //学生信息结构体 public struct Student { static readonly string[] LastNames = //姓列表 new string[] { "赵", "钱", "孙", "李", "周", "吴", "郑", "王" }; static readonly string[] FirstNames = //名列表 new string[] { "一", "二", "三", "四", "五", "六", "七", "八" }; static readonly Random R = new Random(); public readonly string Name; //姓名 public readonly int Number; //学号 public readonly int Grade; //年级 public readonly int Result; //成绩 public Student( int number) { this.Name = LastNames[R.Next(LastNames.Length)] //随机生成姓 + FirstNames[R.Next(FirstNames.Length)]; //随机生成名 this.Number = number; this.Grade = R.Next( 1, 5); //随机生成年级 this.Result = R.Next( 101); //随机生成分数 } } //链表节点 public class StudentNode { public Student Student { get; set; } public StudentNode Next { get; set; } public StudentNode(Student student, StudentNode next) { this.Student = student; this.Next = next; } } //链表类 public class StudentLinkList { public StudentNode Head { get; set; } public StudentLinkList( int Count) { Head = new StudentNode( new Student( 20100000 + Count), null); for ( int i = Count - 1; i > 0; i--) {
//头插法建表
Head = new StudentNode( new Student( 20100000 + i), Head); } } } class Program { static void Main( string[] args) { //实例化学生信息表1 StudentLinkList list1 = new StudentLinkList( 5); StudentNode node1 = list1.Head; Console.WriteLine( "out student 1 information :"); //遍历打印输出 while (node1 != null) { Console.Write(node1.Student.Name + "\t"); //指向下一个 node1 = node1.Next; } Console.WriteLine(); Console.WriteLine( "输出学生信息表2:"); //实例化学生信息表2 StudentLinkList list2 = new StudentLinkList( 5); StudentNode node2 = list2.Head; while (node2 != null) { Console.Write(node2.Student.Name + "\t"); node2 = node2.Next; } //交叉合并前初始化 node1 = list1.Head; node2 = list2.Head; while (node1 != null && node2 != null) { list2.Head = node2.Next; //取出list2表当前节点(第一次循环,则是头节点) node2.Next = node1.Next; //由node2负责链接node1后续节点 node1.Next = node2; //node1指向node2; 插入完成 node1 = node2.Next; //重置node1 node2 node2 = list2.Head; //node1指向的是list1(新表)的第三元素;node2指向的是表list2(新表)第一元素 } Console.WriteLine(); Console.WriteLine( "输出合并后的学生信息表:"); { node1 = list1.Head; while (node1 != null) { Console.Write(node1.Student.Name + "\t"); node1 = node1.Next; } } } } } |