//显示单链表 public void DisplayLinkList() { LinkListNode currentNode = Head; while (currentNode != null) { Console.WriteLine(currentNode.Data); currentNode = currentNode.Next; //遍历单链表 } }
//单链表添加结点 - 头部插入, 单链表顺序反过来了 public void AddNodeToLinkListFromHead(LinkListNode node) { if (Head == null) { Head = node; Length++; return; } else { node.Next = Head; Head = node; Length++; } }
//判断是否有环 public bool HasCycle(LinkListNode head) { LinkListNode fast = head; LinkListNode slow = head; while (slow != null && fast.Next != null) { slow = slow.Next; fast = fast.Next.Next; if (slow == fast) { return(true); } } return(false); }
//查找操作- 根据索引查找 - 实现2 public LinkListNode GetNodeByIndex2(int index) { if (index < 0 || index > Length) { throw new Exception("Index out of bound"); } else { LinkListNode tmpNode = head; for (int i = 0; i < index; i++) { tmpNode = tmpNode.Next; } return(tmpNode); } }
//查找操作- 根据索引查找 - 实现1 public LinkListNode GetNodeByIndex(int index) { if (index < 0 || index > Length) { throw new Exception("Index out of bound"); } else { LinkListNode tmpNode = Head; for (int i = 0; i < Length; i++, tmpNode = tmpNode.Next) { if (i == index) { return(tmpNode); } } return(null); } }
//给单链表添加结点 - 尾部插入 public void AddNodeToLinkList(LinkListNode node) { //先判断当前链表是否非空 if (Head == null) { Head = node; Length++; return; } else { LinkListNode currentNode = Head; while (currentNode.Next != null) { currentNode = currentNode.Next; //遍历这个单链表,直到currentNode到达最后一个结点 } currentNode.Next = node; //将要加入的node加入到链表的结尾,即将最后一个节点的指针域指向新节点 Length++; } }
//移除某个节点只需将其之前的节点的Next指针指向要移除节点的后一个节点即可 public void DeleteNodeAt(int index) { if (index == 0) { head = Head.Next; } else { LinkListNode preDeleteNode = this.GetNodeByIndex(index - 1); if (preDeleteNode.Next == null) { throw new Exception("Index out of bound"); } LinkListNode deleteNode = preDeleteNode.Next; preDeleteNode.Next = deleteNode.Next; deleteNode = null; } length--; }
//单链表翻转 public LinkListNode ReverseLinkList(LinkListNode head) { if (head == null || head.Next == null) { return(head); } LinkListNode nextNode = null; LinkListNode preNode = null; LinkListNode currencNode = head; while (currencNode != null) { //currencNode.setNext(preNode); //将当前node的next域指向preNode currencNode.Next = preNode; preNode = currencNode; //移动指针,下一个操作preNode currencNode = nextNode; } return(preNode); }
//Title: 单链表删除中间节点 //实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定你只能访问该节点。 // 思路: 方法是用要删除节点的下一个位置,去替代要删除的节点 public void DeleteMiddleNode(LinkListNode linkList, LinkListNode node) { node.Next = node.Next.Next; node.Data = node.Next.Data; }
public void setNext(LinkListNode next) { Next = next; }
public LinkListNode() { Data = 0; Next = null; }
public LinkListNode(LinkListNode node) { Next = node; }
public DLinkListActionDemo(LinkListNode headNode) { Head = headNode; }
// 删除中间节点, 思路: 方法是用要删除节点的下一个位置,去替代要删除的节点 public void DeleteMiddleNode(DLinkListActionDemo linkList, LinkListNode node) { node.Next = node.Next.Next; node.Data = node.Next.Data; }