链表5个常见操作:
初学链表手写链表代码时很容易出现各种各样的错误,这还导致需要写代码时有了很大的心理障碍,但是在自己把这几个常见的链表操作写熟练后对链表中终于不再望而生畏了,记录一下。
- 单链表反转
- 链表中环的检测
- 两个有序链表合并
- 删除链表倒数第n个结点
- 求链表的中间结点
链表实现:
public class Node {
int data;
Node next;
Node(int data){
this.data = data;
}
}
单链表反转:
单链表反转有迭代反转法、递归反转法、就地逆置反转法、头插法四种实现方法。
- 迭代反转链表
设置三个指针beg、mid、end,beg指针指向mid指针的前一个指针,end指针指向mid指针的后一个指针,初始状态mid指针指向头结点,然后遍历链表,依次改变mid指针的next指针,使其指向前一个结点,随后将三个指针后移直至mid指针遍历完链表。
实现:
//单链表反转:迭代法
public static Node reverseByLoop(Node head) {
if(head == null || head.next == null) {
return head;
}
Node pre = null;
Node next = null;
while(head != null) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
- 递归反转链表
递归到链表的尾结点,从尾结点开始依次向前遍历,遍历过程中依次改变各结点的指向,使其next指针指向前一个结点。
实现:
//单链表反转:递归反转法
public static Node reverseByRecursion(Node head) {
if(head == null || head.next ==null) {
return head;
}
Node newNode = reverseByRecursion(head.next);
head.next.next = head;
head.next = null;
return newNode;
}
- 头插法反转链表:
在原有链表的基础上,依次将链表的结点摘下,然后采用从头部插入的方式生成一个新链表。
实现:
//单链表反转:头插法
public static Node reverseByAdd(Node head) {
Node newHead = null;
Node tmp = null;
if(head

本文介绍了链表的五个经典操作:单链表反转、链表中环的检测、两个有序链表合并、删除链表倒数第n个结点及求链表的中间结点。并提供了每种操作的多种实现方法,包括递归、迭代等。

389

被折叠的 条评论
为什么被折叠?



