题目描述:
给定一个带头结点的单链表,请将其逆序。即如果单链表原来为head->1->2->3->4->5->6->7, 则逆序后变为head->7->6->5->4->3->2->1。
单链表的结构:
对单链表中任何一个结点的访问只能从链表的头指针开始进行遍历。
就地逆序
主要思路:在遍历链表时,修改当前结点的指针域的指向,让其指向它的前驱结点。
public static void main(String[] args){
ListNode head = new ListNode();
ListNode curr = head;
ListNode tmp = null;
for (int i=1;i<8;i++){
tmp = new ListNode(i);
curr.next = tmp;
curr = tmp;
}
curr = head.next;
while (curr!=null){
System.out.print(curr.val+" ");
curr = curr.next;
}
reverseListNode(head);
System.out.println();
curr = head.next;
while (curr!=null){
System.out.print(curr.val+" ");
curr = curr.next;
}
}
public static void reverseListNode(ListNode head){
if (head==null || head.next == null) return;
ListNode pre = head.next;
ListNode curr = pre.next;
ListNode next = curr.next;
pre.next = null;
while (curr!=null){
curr.next = pre;
pre = curr;
curr = next;
next = curr == null ? curr : curr.next;
}
head.next = pre;
}
性能分析:时间复杂度O(N):只遍历了一次;
需要常数个额外的变量来保存当前的结点,因此空间复杂度为O(1)
《Java程序员面试算法宝典》