一:单链表的相关操作
1.1:单链表增加一个元素
1.2:单链表删除指定位置的元素(删除某个元素)
1.3:单链表打印
1.4:单链表的反转
1.5:单链表找出倒数第k个节点的元素
1.6:从尾到头打印一个单链表
1.7:找出单链表中中间节点的值
二:代码(java实现)
2.1:构造一个节点,相当于Java中的结构体
/** * 相当于结构体类 */ class ChainNode { int data; ChainNode next; public ChainNode(int data) { this.data = data; } }
2.2:向单链表中增加一个元素
/**
* 链表头结点
*/
private ChainNode head = null;
public void setHead(ChainNode head) {
this.head = head;
}
public ChainNode getHead() {
return this.head;
}
/**
* 向链表中增加添加数据
*/
public void addNode(int data) {
ChainNode node = new ChainNode(data);
if (head == null) {
head = node;
return;
}
ChainNode temp = head;
// 移动指针到尾节点
while (temp.next != null) {
temp = temp.next;
}
// 从尾节点插入
temp.next = node;
}
2.3:从头到尾输出链表内容
/** * 输出链表数据 */ public void printList() { ChainNode node = head; while (node != null) { System.out.print(node.data + ","); node = node.next; } }
2.4:从尾到头输出链表内容
/** * 从尾到头打印节点 * * @param head2 *步骤: 1:使用递归的方式,在C语言中我们一般使用栈来解决 * 2:把链表从头到尾遍历一遍放到栈中,在从栈中去读 */ private void printReverseList(ChainNode headNode) { if (headNode != null) { printReverseList(headNode.next); System.out.print(headNode.data + ","); } }
2.5:删除指定位置的节点
/** * 链表删除一个某个指定节点的数据 */ private boolean deleteNode(int index) { // 数组下表小于0或者大于数组长度 if (head == null || index < 0 || index > length()) { return false; } if (index == 1) { // 删除头节点 head = head.next; } // 删除非头节点 int count = 2; ChainNode preNode = head; ChainNode curNode = preNode.next; while (curNode != null) { if (count == index) { preNode.next = curNode.next; curNode.next = null; return true; } // 坐标后移 preNode = curNode; curNode = curNode.next; count++; } return false; }
2.6:实现链表的反转
/** * 实现链表的反转 * 步骤 1:用三个指针 preNode,currentNode,nextNode, next暂存下一个节点 */ private void reverserNode() { if (head == null) { return; } ChainNode preNode = head; ChainNode curNode = head.next; ChainNode nextNode = null; while (curNode != null) { // 暂存下一节点 nextNode = curNode.next; // 当前节点指向上一个节点 curNode.next = preNode; // 指针后移 preNode = curNode; curNode = nextNode; } head.next = null; this.head = preNode; }
2.7: 找出单链表中倒数第k个节点
* 找出单链表中倒数第K个位置 * 步骤: * 1:设置两个指针,第一个指针比第二个指针早走K步, * 2:第一个指针到达末尾.第二个指针刚好在第K的位置 * */ private ChainNode findInverseNode(int k) { if (head == null || k < 0 || k > length()) { return null; } ChainNode frontNode = head; ChainNode rearNode = head; for (int i = 0; i < k; i++) { rearNode = rearNode.next; } while (rearNode.next != null) { frontNode = frontNode.next; rearNode = rearNode.next; } return frontNode; }
2.8:找出链表中的中间节点的值
/** * 寻找单链表的中间节点 * 思路: * 设置两个工作指针,frontNode一次走一步、rearNode一次走两步 * 当rearNode到达链表尾部时,frontNode指向的就是单链表的中间节点 * 注: * 当链表的个数为奇数时,frontNode指向的就是中间的节点 * 当链表的个数为偶数时,frontNode指向的节点和frontNode。next都是链表的中间节点 */ private ChainNode findMidNode() { ChainNode frontNode = head; ChainNode rearNode = head; while(rearNode != null && rearNode.next != null && rearNode.next.next != null){ frontNode = frontNode.next; rearNode = rearNode.next.next; } return frontNode; }三:源代码下载
扫描二维码关注公众号,回复:
42393 查看本文章