题目描述
把链表相邻元素翻转,如给定链表为1→2→3→4→5→6→7,则翻转后的链表为2→1→4→3→6→5→7
方法一:交换值法
最容易想到的方法就是交换相邻两个结点的数据域,这种方法由于不需要重新调整链表的结构,因此比较容易实现,但是这种方法并不是考官所期望的解法
方法二:就地逆序
主要思路:通过调整结点指针域的指向来直接调换相邻的两个结点。如果单链表恰好有偶数个结点,那么只需要将奇偶结点对调即可,如果链表有奇数个结点,那么只需要将除了最后一个结点外的其它结点进行奇偶对调即可。
class LNode {
/**
* 数据域
*/
int data;
/**
* 下一个结点的引用
*/
LNode next;
}
public class Test7 {
public static void reverse(LNode head){
/**
* @Author: JavaRecord
* @Description:把链表相邻元素翻转
* @Param [head]
* @Return void
* @Date 2020/8/14
* @Time 20:40
*/
//判断是否为空
if(head==null || head.next==null){
return;
}
//当前遍历结点
LNode cur = head.next;
//当前结点的前驱结点
LNode pre = head;
//当前结点后继结点的后继结点
LNode next = null;
while (cur!=null&&cur.next!=null){
next = cur.next.next;
pre.next = cur.next;
cur.next.next = cur;
cur.next = next;
pre = cur;
cur = next;
}
}
public static void main(String[] args){
int i = 1;
LNode head = new LNode();
head.next = null;
LNode tmp = null;
LNode cur = head;
for(;i<8;i++){
tmp = new LNode();
tmp.data = i;
tmp.next = null;
cur.next = tmp;
cur = tmp;
}
System.out.print("顺序输出:");
for(cur=head.next;cur!=null;cur=cur.next){
System.out.print(cur.data+" ");
}
reverse(head);
System.out.print("\n逆序输出:");
for(cur=head.next;cur!=null;cur=cur.next){
System.out.print(cur.data+" ");
}
}
}
程序的运行结果为:
顺序输出:1 2 3 4 5 6 7
逆序输出:2 1 4 3 6 5 7
算法性能分析
对链表进行一次遍历,时间复杂度为O(N),只需要几个指针变量来保存结点的地址信息,空间复杂度为O(1)