【题目描述】
AcWing 35. 反转链表
【思路】
类比交换排序 对链表中元素值两两进行交换
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode h = head;
//链表长度
int n = 0;
while(h != null){
h = h.next;
n ++;
}
//n个节点 交换n - 1次
int t = 0;
while( t < n - 1){
//p在前 q在后
ListNode q = head;
ListNode p = q.next;
for(int i = 0; i < n - t - 1 ; i ++){
//链尾
if(p == null) continue;
while( p != null && p != q){
//交换p、q节点元素值
int x = p.val;
p.val = q.val;
q.val = x;
//q前进
q = q.next;
}
//q赶上p了 p++
p = p.next;
}
t ++;
}
return head;
}
}
【思路】
翻转链表即将所有节点的next域指向其前驱节点。
由于是单链表,所以在迭代时不能直接找到前驱节点,所以需要一个额外的指针pre来保存前驱结点。在改变当前节点cur的next前,需要保存它的后继节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode h) {
ListNode cur = h;
ListNode pre = null;
while(cur != null){
//保存cur的后继
ListNode tmp = cur.next;
//将当前节点的后继修改为原来的前继
cur.next = pre;
//前继后移
pre = cur;
//cur后移
cur = tmp;
}
return pre;
}
}